PHP – Как объединить массивы внутри массива

Как слить n число массивов в php. Я имею в виду, как я могу сделать работу, как:
array_merge(from : $result[0], to : $result[count($result)-1])
ИЛИ
array_merge_recursive(from: $result[0], to : $result[count($result) -1])

Где $result – массив с несколькими массивами внутри него:

 $result = Array( 0 => array(),//associative array 1 => array(),//associative array 2 => array(),//associative array 3 => array()//associative array ) 

Мой результат:

 $result = Array( 0 => Array( "name" => "Name", "events" => 1, "types" => 2 ), 1 => Array( "name" => "Name", "events" => 1, "types" => 3 ), 2 => Array( "name" => "Name", "events" => 1, "types" => 4 ), 3 => Array( "name" => "Name", "events" => 2, "types" => 2 ), 4 => Array( "name" => "Name", "events" => 3, "types" => 2 ) ) 

И мне нужно

 $result = Array( "name" => "name", "events" => array(1,2,3), "types" => array(2,3,4) ) 

array_merge может принимать переменное количество аргументов, поэтому с небольшим обманом call_user_func_array вы можете передать свой массив $result :

 $merged = call_user_func_array('array_merge', $result); 

Это в основном работает, как если бы вы набрали:

 $merged = array_merge($result[0], $result[1], .... $result[n]); 

Обновить:

Теперь с 5.6 мы имеем оператор ... для распаковки массивов в аргументы, чтобы вы могли:

 $merged = array_merge(...$result); 

И имеют те же результаты. *

* Те же результаты, что и у вас есть целые ключи в распакованном массиве, иначе вы получите E_RECOVERABLE_ERROR : type 4096 -- Cannot unpack array with string keys ошибками.

Если вы хотите:

  • убедитесь, что каждый параметр, входящий в array_merge, фактически является массивом
  • укажите конкретное свойство в одном из массивов, чтобы объединить

Вы можете использовать эту функцию:

 function mergeArrayofArrays($array, $property = null) { return array_reduce( (array) $array, // make sure this is an array too, or array_reduce is mad. function($carry, $item) use ($property) { $mergeOnProperty = (!$property) ? $item : (is_array($item) ? $item[$property] : $item->$property); return is_array($mergeOnProperty) ? array_merge($carry, $mergeOnProperty) : $carry; }, array()); // start the carry with empty array } 

Давайте посмотрим на это в действии. Вот некоторые данные:

Простая структура: чистый массив массивов для объединения.

 $peopleByTypesSimple = [ 'teachers' => [ 0 => (object) ['name' => 'Ms. Jo', 'hair_color' => 'brown'], 1 => (object) ['name' => 'Mr. Bob', 'hair_color' => 'red'], ], 'students' => [ 0 => (object) ['name' => 'Joey', 'hair_color' => 'blonde'], 1 => (object) ['name' => 'Anna', 'hair_color' => 'Strawberry Blonde'], ], 'parents' => [ 0 => (object) ['name' => 'Mr. Howard', 'hair_color' => 'black'], 1 => (object) ['name' => 'Ms. Wendle', 'hair_color' => 'Auburn'], ], ]; 

Менее просто: массив массивов, но хотел бы указать людей и игнорировать счет .

 $peopleByTypes = [ 'teachers' => [ 'count' => 2, 'people' => [ 0 => (object) ['name' => 'Ms. Jo', 'hair_color' => 'brown'], 1 => (object) ['name' => 'Mr. Bob', 'hair_color' => 'red'], ] ], 'students' => [ 'count' => 2, 'people' => [ 0 => (object) ['name' => 'Joey', 'hair_color' => 'blonde'], 1 => (object) ['name' => 'Anna', 'hair_color' => 'Strawberry Blonde'], ] ], 'parents' => [ 'count' => 2, 'people' => [ 0 => (object) ['name' => 'Mr. Howard', 'hair_color' => 'black'], 1 => (object) ['name' => 'Ms. Wendle', 'hair_color' => 'Auburn'], ] ], ]; 

Запустить его

 $peopleSimple = mergeArrayofArrays($peopleByTypesSimple); $people = mergeArrayofArrays($peopleByTypes, 'people'); 

Результаты. Оба возвращают это:

 Array ( [0] => stdClass Object ( [name] => Ms. Jo [hair_color] => brown ) [1] => stdClass Object ( [name] => Mr. Bob [hair_color] => red ) [2] => stdClass Object ( [name] => Joey [hair_color] => blonde ) [3] => stdClass Object ( [name] => Anna [hair_color] => Strawberry Blonde ) [4] => stdClass Object ( [name] => Mr. Howard [hair_color] => black ) [5] => stdClass Object ( [name] => Ms. Wendle [hair_color] => Auburn ) ) 

Extra Fun : Если вы хотите выделить одно свойство в массиве или объекте, например «имя» из массива объектов людей (или ассоциированных массивов), вы можете использовать эту функцию

 function getSinglePropFromCollection($propName, $collection, $getter = true) { return (empty($collection)) ? [] : array_map(function($item) use ($propName) { return is_array($item) ? $item[$propName] : ($getter) ? $item->{'get' . ucwords($propName)}() : $item->{$propName} }, $collection); } 

Геттер предназначен для защищенных / частных объектов.

$namesOnly = getSinglePropFromCollection('name', $peopleResults, false);

возвращается

 Array ( [0] => Ms. Jo [1] => Mr. Bob [2] => Joey [3] => Anna [4] => Mr. Howard [5] => Ms. Wendle ) 

Мне очень понравился ответ от complex857, но он не сработал для меня, потому что у меня были цифровые ключи в моих массивах, которые мне нужно было сохранить.

Я использовал оператор + для сохранения ключей (как предложено в PHP array_merge с числовыми ключами ) и использовал array_reduce для объединения массива.

Поэтому, если вы хотите объединить массивы внутри массива, сохранив числовые ключи, вы можете сделать это следующим образом:

 <?php $a = [ [0 => 'Test 1'], [0 => 'Test 2', 2 => 'foo'], [1 => 'Bar'], ]; print_r(array_reduce($a, function ($carry, $item) { return $carry + $item; }, [])); ?> 

Результат:

 Array ( [0] => Test 1 [2] => foo [1] => Bar ) 

Попробуй это

 $result = array_merge($array1, $array2); 

Или вместо array_merge вы можете использовать + op, который выполняет объединение:

 $array2 + array_fill_keys($array1, '');