объединить два (или более ..) многомерных массива в php - PullRequest
2 голосов
/ 02 февраля 2010

У меня есть запрос, который я запускаю несколько раз с разными параметрами. Я использую парсер xml для возврата результатов в jQuery.

Я не могу найти способ объединить результаты на первом «узле» без перезаписи первой записи.

Упрощенный пример кода:

$temp1 = returnArray(0);

$temp2 = returnArray(1);

$data = array_merge($temp1, $temp2);

print_r($data);

function returnArray($switch)
{
    if($switch == 0)
    {
        $data['data']['first'] = "something";
    } else {
        $data['data']['second'] = "something ELSE";
    }
    return $data;
}

приводит к распечатке Array ( [data] => Array ( [second] => something ELSE ) ) - $ temp2 перезаписывает $ temp1. Я понимаю, что это поведение по умолчанию для array_merge (), что меня смущает.

Я также пытался сделать что-то вроде $data = $temp1+$temp2; или ...

$data = returnArray(0);

$data += returnArray(1);

отпечатки Array ( [data] => Array ( [first] => something ) )

или ...

$data = returnArray(0);

$data .= returnArray(1);
print_r($data);

отпечатков ArrayArray

В итоге я взломал это вместе:

$data['data'] = returnArray(0);
$data['data'] = returnArray(1);

function returnArray($switch){
  if($switch == 0) return Array('first' => 'something');
  else return Array('second' => 'something else');
}

Что меня не так устраивает ... Хотя в этом случае он выполняет свою работу, в будущем это будет не совсем применимо, когда возникнет более сложная ситуация.

Есть ли лучший способ взять два ассоциативных многомерных массива и объединить их без перезаписи?

EDIT:

Мне бы хотелось, чтобы метод был многоразовым, расширяемым и мог обрабатывать массивы 2+ с размерами 2+.

1 Ответ

3 голосов
/ 02 февраля 2010

PHP фактически предоставляет функцию с именем array_merge_recursive(), которая используется именно в этом типе сценария. Со страницы документации :

array_merge_recursive() объединяет элементы одного или нескольких массивов вместе, так что значения одного добавлен в конец предыдущего один. Возвращает результирующий массив.

Если входные массивы имеют одинаковые строковые ключи, затем значения для этих ключи объединены в массив, и это делается рекурсивно, так что если одно из значений является сам массив, функция будет сливаться это с соответствующей записью в другой массив тоже. Если, однако, массивы имеют одинаковый цифровой ключ, позднее значение не будет перезаписывать исходное значение, но будет добавлено.

Пример:

<?php
$ar1 = array("color" => array("favorite" => "red"), 5);
$ar2 = array(10, "color" => array("favorite" => "green", "blue"));
$result = array_merge_recursive($ar1, $ar2);
print_r($result);
?>

Выход:

Array
(
    [color] => Array
        (
            [favorite] => Array
                (
                    [0] => red
                    [1] => green
                )

            [0] => blue
        )

    [0] => 5
    [1] => 10
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...