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, ''); 
    Interesting Posts