У меня есть два массива животных (например).
$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?
Это делает то, что предложил Эрик (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']; } }
@Энди
Это была моя первая мысль, но это не совсем сработало – но 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; }