Intereting Posts
Использование Gmails Исходящий SMTP из PHP с использованием TLS Установите границы ячеек в пунктах tcpdf WriteHTML Рекомендуемое изображение из внешнего URL-адреса не работает должным образом Laravel 5 Socialite – ошибка cURL 77: проверка сертификатов ошибок Не работает перенаправление php PHP: проверять базу данных mysql каждые 10 секунд для любых новых строк Сохранение HABTM с дополнительными полями? Добавление программно более загружаемых файлов для продуктов в WooCommerce Как получить IP-адрес пользователя в PHP? merge_array возвращает null, если один или несколько массивов пуст? Как установить ремесленника Laravel? Ajax с несколькими кнопками отправки Как заставить пользователя подписаться на событие в facebook с помощью Graph API? php – преобразование данных из базы данных в иерархический массив PHP: Кириллические (русские) символы повторяются как «Вопросительные знаки». Зачем?

PHP – Объединение значений массива в новый массив, учитывая два массива с идентичными ключами

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

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" } 

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

Solutions Collecting From Web of "PHP – Объединение значений массива в новый массив, учитывая два массива с идентичными ключами"

Учитывая $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 ) 

Скорее всего, это то, что вы хотели.

РЕДАКТИРОВАТЬ:

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