Объединение двух многомерных массивов по определенному ключу

Предположим, у меня есть следующие массивы:

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 . Желаемая сортировка результатов должна быть такой же, как в первом массиве.

Как я могу это достичь? Буду признателен за любую оказанную помощь.

Вы можете просто выполнить вложенный цикл и проверить, соответствуют ли значения id , а затем добавить title в значение $first (или name to $second )

 foreach($first as $key => $value){ foreach($second as $value2){ if($value['id'] === $value2['id']){ $first[$key]['title'] = $value2['title']; } } } 

Вы правильно работаете. Ваши ожидания просто неверны. Например, в одном массиве id 4-го элемента содержит 1, но в другом массиве 4-й id элемента равен 5, поэтому ваш «объединить эти массивы с одним и тем же идентификатором» не имеет смысла, так как слияние 4-го элемента в один, вы также объединяете своих детей, и поскольку id используется в обоих массивах, после того, как значение HAVE должно исчезнуть, поскольку в массиве не может быть двух равных ключей.

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

вам необходимо объединить вручную, поскольку функции 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'; }