Объединение двух многомерных массивов по определенному ключу
Допустим, у меня есть следующие массивы:
Array
(
[0] => Array
(
[id] => 5
[name] => Education
)
[1] => Array
(
[id] => 4
[name] => Computers
)
[3] => Array
(
[id] => 7
[name] => Science
[4] => Array
(
[id] => 1
[name] => Sports
)
)
и второе:
Array
(
[0] => Array
(
[id] => 1
[title] => Sport
)
[1] => Array
(
[id] => 7
[title] => Sci
)
[3] => Array
(
[id] => 4
[title] => Comp
[4] => Array
(
[id] => 5
[title] => Edu
)
)
и желаемый результат-это:
Array
(
[0] => Array
(
[id] => 5
[name] => Education
[title] => Edu
)
[1] => Array
(
[id] => 4
[name] => Computers
[title] => Comp
)
[3] => Array
(
[id] => 7
[name] => Science
[title] => Sci
[4] => Array
(
[id] => 1
[name] => Sports
[title] => Sport
)
)
мне удалось объединить эти массивы просто:
foreach($first as $key => $value){
$result[$key] = array_merge($first[$key], $second[$key]);
}
но выход не комбинируется правильно:
Array
(
[0] => Array
(
[id] => 5
[name] => Education
[title] => Sport
)
[1] => Array
(
[id] => 4
[name] => Computers
[title] => Sci
)
[3] => Array
(
[id] => 7
[name] => Science
[title] => Comp
[4] => Array
(
[id] => 1
[name] => Sports
[title] => Edu
)
)
проблема в том, что я хотел бы объединить эти массивы на том же id
.
Желаемая сортировка вывода должна быть такой же, как и в первом массиве.
как я могу этого достичь? Любой помощь очень ценится.
5 ответов
вы можете просто сделать вложенный цикл и проверить, если id
значения совпадают, затем добавьте title
to $first
(или name
до $second
)
foreach($first as $key => $value){
foreach($second as $value2){
if($value['id'] === $value2['id']){
$first[$key]['title'] = $value2['title'];
}
}
}
код работает нормально. Ваши ожидания просто неверны. Например в одном массиве 4-й элемент id
содержит 1, но в другом массиве 4-й элемент id
это 5, так что ваш "объединить эти массивы на одном id" не имеет смысла, так как при слиянии 4-х элементов в один вы также объединяете своих детей, и так как id
используется в обоих массивах, как только значение должно исчезнуть, поскольку в массиве не может быть двух одинаковых ключей.
редактировать
вы должны слияние вручную как слияние функций PHP на основе ключи в то время как вы хотите объединить на основе контент:
$result = array();
foreach( $arrayA as $keyA => $valA ) {
foreach( $arrayB as $keyB => $valB ) {
if( $valA['id'] == $valB['id'] ) {
$result[$keyA] = $valA + $valB;
// or if you do not care output keys, just
// $result[] = $valA + $valB;
}
}
}
пока оба массива всегда имеют каждый идентификатор в них, как насчет сортировки двух массивов по этому полю "id", а затем позволить php выполнить слияние?
function cmp($a, $b) {
return ((int) $a['id'] < (int) $b['id']) ? -1 : 1;
}
usort($array1, 'cmp');
usort($array2, 'cmp');
$result = array_merge($array1, $array2);
не тестировали код, но он демонстрирует идею.
Не используйте foreach в foreach, это может быть слишком медленно, когда массив такой большой.
$idArray = array_column($secondArray,'title','id');
foreach($firstArray as $key => $val){
$firstArray[$key]['title'] = (isset($idArray[$val['id']]) ? $idArray[$val['title'] : 'some title';
}
убедитесь, что элементы находятся в том же порядке:
$items = array_map(function($itemFirstArray, $itemSecondArray) {
return array_merge($itemFirstArray, $itemSecondArray);
}, $firstArray, $secondArray);