PHP - объединение значений массива в новый массив с двумя массивами с одинаковыми ключами - PullRequest
1 голос
/ 11 июня 2011

У меня есть форма, которая представляет отчет о контрольно-пропускных пунктах. Каждая контрольная точка имеет «статус» и «комментарий». Форма настроена таким образом, что она возвращает многомерный массив, ключом которого является идентификатор контрольной точки, например:

array(3) {
  ["status"]=>
  array(2) {
    ["000046"]=>
    string(1) "S"
    ["000047"]=>
    string(1) "S"
  }
  ["comment"]=>
  array(2) {
    ["000046"]=>
    string(6) "Flarg."
    ["000047"]=>
    string(0) ""
  }
  ["submit"]=>
  string(13) "SUBMIT REPORT"
}

В приведенном выше пункте контрольная точка 000046 имеет статус «S» и комментарий «Flarg.»

Что я хотел бы сделать, так это создать новый массив, соединив два значения в определенном формате, сохранив ключи. Финал должен выглядеть так:

array(1) {
  ["000046"]=>
  string(10) "S-'Flarg.'"
  ["000047"]=>
  string(1) "S"
}

Какой самый эффективный способ сделать это?

Ответы [ 4 ]

1 голос
/ 11 июня 2011

Учитывая $array и $array2 ваши два массива

$result = array();
foreach( $array as $k=>$v ) {
  $result[$k] = $v;
  if (isset($array2[$k]))
    $result[$k] .= '-' . $array2[$k];
}
print_r($result);
0 голосов
/ 11 июня 2011

Сначала объедините рекурсивные массивы со статусами и комментариями, затем склейте обе части следующим образом:

$output = array_merge_recursive($array['status'], $array['comment']);
array_walk($output, function (&$value, $key) { $value = empty($value[1]) ? $value[0] : $value[0]."-'".$value[1]."'"; });

Но это будет работать только с PHP версии 5.3 или выше. Чтобы сделать то же самое в более низкой версии PHP, вы должны сначала создать свою функцию, а затем передать ее имя:

function gluecomments(&$value, $key) { $value = empty($value[1]) ? $value[0] : $value[0]."-'".$value[1]."'"; }
$output = array_merge_recursive($array['status'], $array['comment']);
array_walk($output, 'gluecomments');

Доказательство:

Для этого ввода:

$array = array(
    'status' => array(
        '000046' => 'S',
        '000047' => 'S',
    ),
    'comment' => array(
        '000046' => 'Flarg.',
        '000047' => '',
    ),
    'submit' => 'SUBMIT REPORT',
);

print_r($output) напечатано следующее:

Array
(
    [000046] => S-'Flarg.'
    [000047] => S
)

Что, вероятно, то, что вы хотели.

EDIT:

Я удалил проверки, является ли это массивом или нет - я предполагаю, что переменная всегда находится в том формате, который вы нам дали, поэтому это не требуется.

0 голосов
/ 11 июня 2011

Учитывая $checkpoints в качестве array, указанного в вашем вопросе, вы можете использовать:

$newCheckpoints = array();
foreach ($checkpoints['status'] as $k => $status) {
    $newCheckpoints[$k] = $status . (!empty($checkpoints["comment"][$k]) ? "-'{$checkpoints['comment'][$k]}'" : '');
}
0 голосов
/ 11 июня 2011

Нет встроенной функции PHP, которая бы делала это для вас (это было бы наиболее эффективно).Просто переберите оба массива и начните собирать.

Пример кода был бы оскорбительным, поэтому я его опустил.

...