Подтвердить что ты не робот

Как я могу объединить массивы 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?

4b9b3361

Ответ 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); 
}

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

Ответ 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;
}