Как я могу объединить массивы PHP?

У меня есть два массива животных (например).

$array = array( array( 'id' => 1, 'name' => 'Cat', ), array( 'id' => 2, 'name' => 'Mouse', ) ); $array2 = array( array( 'id' => 2, 'age' => 321, ), array( 'id' => 1, 'age' => 123, ) ); 

Как я могу объединить два массива в один по ID?

Solutions Collecting From Web of "Как я могу объединить массивы PHP?"

Это делает то, что предложил Эрик (id no. As array key) и объединяет vlaues в $array2 to $results .

 $results = array(); foreach($array as $subarray) { $results[$subarray['id']] = array('name' => $subarray['name']); } foreach($array2 as $subarray) { if(array_key_exists($subarray['id'], $results)) { // Loop through $subarray would go here if you have extra $results[$subarray['id']]['age'] = $subarray['age']; } } 

@Энди

http://se.php.net/array_merge

Это была моя первая мысль, но это не совсем сработало – но array_merge_recursive может работать – слишком ленив, чтобы проверить прямо сейчас.

Во-первых, почему бы вам не использовать идентификатор в качестве индекса (или ключа в массиве типа сопоставления, который php-массивы являются imo)?

 $array = array( 1 => array( 'name' => 'Cat', ), 2 => array( 'name' => 'Mouse', ) ); 

после этого вам нужно будет пройти через один массив, выполнив array_merge на элементах другого:

 foreach($array2 as $key=>$value) { if(!is_array($array[$key])) $array[$key] = $value; else $array[$key] = array_merge($array[key], $value); } 

Что-то вроде этого по крайней мере. Может быть, есть лучшее решение?

 <?php $a = array('a' => '1', 'b' => array('t' => '4', 'g' => array('e' => '8'))); $b = array('c' => '3', 'b' => array('0' => '4', 'g' => array('h' => '5', 'v' => '9'))); $c = array_merge_recursive($a, $b); print_r($c); ?> 

array_merge_recursive – объединить два или более массива рекурсивно

выходы:

  Array ( [a] => 1 [b] => Array ( [t] => 4 [g] => Array ( [e] => 8 [h] => 5 [v] => 9 ) [0] => 4 ) [c] => 3 ) 

@Энди

Я уже посмотрел на это и не видел, как он может помочь объединить многомерные массивы. Может быть, вы могли бы привести пример.

@kevin

Вероятно, это то, что мне нужно будет сделать, как я думаю, код ниже будет очень медленным. Фактический код немного отличается, потому что я использую ADOdb (и ODBC для другого запроса), но я заставлю его работать и опубликовать свой собственный ответ.

Это работает, однако я думаю, что он будет очень медленным, поскольку он проходит через второй цикл каждый раз:

 foreach($array as &$animal) { foreach($array2 as $animal2) { if($animal['id'] === $animal2['id']) { $animal = array_merge($animal, $animal2); break; } } } 
 foreach ($array as $a) $new_array[$a['id']]['name'] = $a['name']; foreach ($array2 as $a) $new_array[$a['id']]['age'] = $a['age']; 

и это результат:

  [1] => Array ( [name] => Cat [age] => 123 ) [2] => Array ( [name] => Mouse [age] => 321 ) 
 <?php $array1 = array("color" => "red", 2, 4); $array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4); $result = array_merge($array1, $array2); print_r($result); ?> 

С PHP 5.3 вы можете выполнить этот слияние с array_replace_recursive ()

http://www.php.net/manual/en/function.array-replace-recursive.php

Результирующий массив должен выглядеть так:

 Array ( [0] => Array ( [id] => 2 [name] => Cat [age] => 321 ) [1] => Array ( [id] => 1 [name] => Mouse [age] => 123 ) ) 

Это то, что я думаю, что вы хотели в результате.

Я бы предпочел, чтобы array_splice над array_merge из-за проблем с производительностью, моим решением было бы:

 <?php array_splice($array1,count($array1),0,$array2); ?> 
 $new = array(); foreach ($array as $arr) { $match = false; foreach ($array2 as $arr2) { if ($arr['id'] == $arr2['id']) { $match = true; $new[] = array_merge($arr, $arr2); break; } } if ( !$match ) $new[] = $arr; }