Intereting Posts
Безопасный способ остановить пользователей от формовки форм Как получить подписанный конверт в docusign Создание индекса с помощью Elasticsearch 5.0 вызывает исключение Bad Request Обнаружение клиентов с помощью прокси-серверов через PHP Динамическое создание периодов даты с использованием MySQL Ошибка в записи в файл изображения из PHP Команды не синхронизированы; вы не можете запустить эту команду сейчас Как получить информацию сертификата SSL с CURL в PHP? Использование длинного опроса ajax для обновления ответа на моей странице с внешнего API Не найти поле в полиморфной ассоциации с Doctrine2 не удалось удалить буфер. Нет буфера для удаления Итерации через определенное дерево каталогов и сохранение всех .ttf-файлов в массив в PHP Как обрабатывать двойные кавычки в строке перед оценкой XPath? Получение первого дня недели в месяц с strtotime Как я могу получить данные prodcut продукта VirtueMart 2 во внешнем файле?

Объединение двух массивов по ID в PHP

Мне нужно сравнить два 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); ); 

Обратите внимание, что для обоих массивов требуются строковые ключи