PHP的 – 如何合并数组内的数组
如何在php中合并n个数组。 我的意思是我该如何做这项工作
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:
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 }
让我们看看它的行动..这里有一些数据:
简单的结构:纯粹的arrays数组合并。
$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 ) )
额外的乐趣 :如果你想单挑出一个数组或对象中的一个属性,比如一个人物对象(或关联数组)中的“名字”,你可以使用这个函数
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中所build议的),并使用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);
或者,您可以使用执行联合的+ op来代替array_merge:
$array2 + array_fill_keys($array1, '');