Сначала используйте идентификатор в качестве ключа:
$arr1 = array_column($arr1, null, "ID");
$arr2 = array_column($arr2, null, "ID");
Затем сортируйте ключ (чтобы решить не те же самые оригинальные индексы:
ksort($arr1);
ksort($arr2);
Затем используйте array_map
как:
$res = array_map('array_merge', $arr1, $arr2);
Используйте array_values
в конце, чтобы игнорировать идентификационные ключи.
И если у вас есть другой массив, содержащий поле идентификатора, вы можете использовать ту же логику - обратите внимание, array_map
может получить более двух входных массивов ...
Ссылка: массив_колонок , массив_карт , массив_мердж , ксорт
Живой пример: 3v4l
Отредактировано
Используемый шаблон для исправления проблемы, когда элемент отсутствует:
$keys = array_merge(array_keys($a[0]), array_keys($b[0]));
$template = array_combine($keys, array_fill(0, count($keys), null)); // create array of null for all keys
$a = array_column($a, null, "ID");
$b = array_column($b, null, "ID");
ksort($a);
ksort($b);
$res = array_map(function ($e1, $e2) use ($template){
if ($e1 && $e2) return array_merge($e1, $e2); // if exist merge
$e = $e1 ? $e1 : $e2; //get the exist element
return array_replace ($template, $e); // add it
}, $a, $b);
Обратите внимание, что это решение будет действительным только для 2 массивов - оно может быть обобщено, но я оставлю это вам
Живой пример: 3v4l