У меня есть форма, которая представляет отчет о контрольных точках. Каждая контрольная точка имеет «статус» и «комментарий». Форма настроена так, что возвращает многомерный массив с ключом, который является идентификатором контрольной точки следующим образом:
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" }
Каков наиболее эффективный способ сделать это ?.
Учитывая $array
и $array2
ваши два массива
$result = array(); foreach( $array as $k=>$v ) { $result[$k] = $v; if (isset($array2[$k])) $result[$k] .= '-' . $array2[$k]; } print_r($result);
Для этого нет встроенной функции PHP, которая была бы наиболее эффективной. Просто запустите оба массива и начните собирать.
Пример кода был бы оскорбительным, поэтому я опустил его.
Учитывая $checkpoints
как array
указанный в вашем вопросе, вы можете использовать:
$newCheckpoints = array(); foreach ($checkpoints['status'] as $k => $status) { $newCheckpoints[$k] = $status . (!empty($checkpoints["comment"][$k]) ? "-'{$checkpoints['comment'][$k]}'" : ''); }
Сначала объедините рекурсивные массивы со статусами и комментариями, затем приклейте обе части следующим образом:
$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 )
Скорее всего, это то, что вы хотели.
РЕДАКТИРОВАТЬ:
Я удалил проверки, независимо от того, массив или нет. Я предполагаю, что переменная всегда в том формате, который вы нам дали, поэтому это не требуется.