Мне нужно сравнить два 2D-массива в PHP. Массивы выглядят так:
Array one ID Name 11 Aa 11 Ab 12 Bb 13 Cc 14 Dd 15 Ee Array two ID Content 11 Cat 13 Dog 14 Donkey
Теперь мне нужно объединить эти два в массив следующим образом:
ID Name Conent 11 Aa Cat 11 Ab Cat 12 Bb 13 Cc Dog 14 Dd Donkey 15 Ee
Как я могу это сделать? Мне не повезло с array_merge () или $ array3 = $ array1 + $ array2;
Быстрый способ – перебрать первый массив и добавить значение из второго:
$array1 = array('11' => 'Aa', '12' => 'Bb', '13' => 'Cc', '14' => 'Dd', '15' => 'Ee'); $array2 = array('11' => 'Cat', '13' => 'Dog', '14' => 'Donkey'); $combined = array(); foreach ($array1 as $key => $val) { $combined[$key] = $val . (isset($array2[$key]) ? ' '.$array2[$key] : ''); }
Это будет проходить через каждый ключ / значение в $array1
и добавлять его в $combined
массив $combined
. Если значение в $array2
существует с тем же индексом, оно добавит его к этому значению из $array1
, разделенного пробелом.
ОБНОВЛЕНИЕ: я неправильно читаю формат массивов (снова). Я предположил, что ID
был фактическим индексом в массиве, но поскольку вывод массива в примере имеет как Name
и Content
, я принимаю ID
, это фактическое значение строки индекса, а не индекс в самом массиве. Чтобы придерживаться сценария цикла, вы можете выполнить итерацию по первому массиву и повторить итерацию вложенного цикла во втором:
$array1 = array( array('ID' => '11', 'Name' => 'Aa'), array('ID' => '12', 'Name' => 'Bb'), array('ID' => '13', 'Name' => 'Cc'), array('ID' => '14', 'Name' => 'Dd'), array('ID' => '15', 'Name' => 'Ee'), ); $array2 = array( array('ID' => '11', 'Content' => 'Cat'), array('ID' => '13', 'Content' => 'Dog'), array('ID' => '14', 'Content' => 'Donkey') ); $combined = array(); foreach ($array1 as $arr) { $comb = array('ID' => $arr['ID'], 'Name' => $arr['Name'], 'Content' => ''); foreach ($array2 as $arr2) { if ($arr2['ID'] == $arr['ID']) { $comb['Content'] = $arr2['Content']; break; } } $combined[] = $comb; }
Это добавит каждое значение в $array1
к объединенному массиву, и если и только если значение в $array2
содержит одно и то же поле ID
, оно добавит его в поле Content
также в массив. Это можно расширить, чтобы обрабатывать любое количество полей, либо по имени, либо путем изменения блока inner-if, чтобы иметь $comb += $arr2;
вместо этого (который должен объединить все несуществующие индексы).
Вам нужно будет сделать свою собственную функцию:
function putThemTogether($array1, $array2) { $output = array(); foreach($array1 as $key => $value) { if (!isset($output[$key])) $output[$key] = array(); $output[$key][] = $value; } foreach($array2 as $key => $value) { if (!isset($output[$key])) $output[$key] = array(); $output[$key][] = $value; } return $output; }
Чтобы сделать это лучше, вы можете заставить его принять произвольное количество аргументов.
$result = array_map ( function ($item) { return is_array($item) ? implode(' ', $item) : $item; }, array_merge_recursive($array1, $array2); );
Обратите внимание, что для обоих массивов требуются строковые ключи