Как я могу рекурсивно объединить массив с уникальным ключом? - PullRequest
0 голосов
/ 17 марта 2020

Я создаю свои массивы так:

foreach ($array as $key => $value) {
          $array1[$value->getUuid()][$value->getFields()->getName()] = $value->getContent();
        }

В результате получается массив1:

array:2 [▼
  "d8ab80f4f6" => array:16 [▶]
  9087785727 => array:16 [▶]
]

Я создаю другой массив немного по-другому, массив2:

array:2 [▼
  "d8ab80f4f6" => array:3 [▶]
  9087785727 => array:3 [▶]
]

Теперь я хочу объединить эти массивы:

$output = array_merge_recursive($array1,$array2);

Вывод:

array:3 [▼
  "d8ab80f4f6" => array:19 [▶]
  0 => array:3 [▶]
  1 => array:16 [▶]
]

Но я ожидаю, что вывод будет:

array:3 [▼
  "d8ab80f4f6" => array:19 [▶]
  "9087785727" => array:19 [▶]
]

Ответы [ 2 ]

1 голос
/ 17 марта 2020

array_merge и array_merge_recursive обрабатывают строковые ключи иначе, чем цифры c keys:

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

Вот что здесь происходит. Ключ 9087785727 является цифрой c, поэтому эти записи не объединяются.

Поэтому вам нужно написать свой собственный l oop.

$output = [];
foreach ($array1 as $key => $value) {
    $output[$key] = array_merge($value, $array2[$key]);
}

DEMO

0 голосов
/ 17 марта 2020

Вы можете использовать следующий foreach loop с ссылкой &:

foreach($ar1 as $key=>&$subar){
    $subar = array_merge($subar,$ar2[$key]); 
}

Демо

...