Как слить 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
ошибками.
Если вы хотите:
Вы можете использовать эту функцию:
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, '');