Как я могу объединить массивы 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?
Ответы
Ответ 1
Это делает то, что предложил Эрик (id no., как массив) и объединяет vlaues в $array2
- $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'];
}
}
Ответ 2
@Andy
http://se.php.net/array_merge
Это была моя первая мысль, но это не совсем сработало - однако array_merge_recursive может работать - слишком ленив, чтобы проверить прямо сейчас.
Ответ 3
Во-первых, почему бы вам не использовать идентификатор в качестве индекса (или ключа в массиве типа сопоставления, в котором 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);
}
Что-то вроде этого по крайней мере. Может быть, есть лучшее решение?
Ответ 4
<?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
)
Ответ 5
@Andy
Я уже посмотрел на это и не видел, как он может помочь объединить многомерные массивы. Может быть, вы могли бы привести пример.
@kevin
Это, вероятно, то, что мне нужно будет сделать, как я думаю, код ниже будет очень медленным.
Фактический код немного отличается, потому что я использую ADOdb (и ODBC для другого запроса), но я заставлю его работать и опубликовать собственный ответ.
Это работает, однако я думаю, что он будет очень медленным, поскольку он проходит через второй цикл каждый раз:
foreach($array as &$animal)
{
foreach($array2 as $animal2)
{
if($animal['id'] === $animal2['id'])
{
$animal = array_merge($animal, $animal2);
break;
}
}
}
Ответ 6
Я предпочел бы array_splice
более array_merge
из-за проблем с производительностью, мое решение было бы:
<?php
array_splice($array1,count($array1),0,$array2);
?>
Ответ 7
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
)
Ответ 8
<?php
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);
?>
Ответ 9
С 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
)
)
Вот что я думаю, что вы хотели в результате.
Ответ 10
$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;
}