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)
)
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
ошибка.
мне очень понравился ответ от 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
)
если вы хотите:
- проверяем, что каждый параметр будет в 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'],
],
];
менее просто: массив массивов, но хотел бы указать человек и игнорировать the графа.
$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
)
)
Развлечения: Если вы хотите выделить одно свойство в массиве или объекте, например "name" из массив объектов people (или ассоциированных массивов), вы можете использовать эту функцию
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
)
попробуй такое
$result = array_merge($array1, $array2);
или вместо array_merge вы можете использовать + op, который выполняет объединение:
$array2 + array_fill_keys($array1, '');