PHP-如何在数组中合并数组

PHP-如何在数组中合并数组,php,array-merge,Php,Array Merge,如何在php中合并n个数组。我的意思是,我该如何做这样的工作: array\u merge(从:$result[0]到:$result[count($result)-1]) 或 array\u merge\u recursive(从:$result[0]到:$result[count($result)-1]) 其中,$result是一个包含多个数组的数组,如下所示: $result = Array( 0 => array(),//associative array 1 => arr

如何在php中合并n个数组。我的意思是,我该如何做这样的工作:
array\u merge(从:$result[0]到:$result[count($result)-1])


array\u merge\u recursive(从:$result[0]到:$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)
)
试试这个

$result = array_merge($array1, $array2);
或者,您可以使用执行并集的+op来代替array_merge:

$array2 + array_fill_keys($array1, '');
可以接受不同数量的参数,因此通过一些技巧,您可以将
$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\u RECOVERABLE\u错误:键入4096——无法使用字符串键解包数组
错误。

我非常喜欢complex857的答案,但它不适合我,因为我的数组中有需要保留的数字键

我使用
+
操作符保留键(如中所建议),并使用
array\u reduce
合并数组

因此,如果要在保留数字键的同时合并数组中的数组,可以按如下操作:

<?php
$a = [
    [0 => 'Test 1'],
    [0 => 'Test 2', 2 => 'foo'],
    [1 => 'Bar'],
];    

print_r(array_reduce($a, function ($carry, $item) { return $carry + $item; }, []));
?>
如果您愿意:

  • 检查进入数组_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
        )

)

额外乐趣: 如果您想在数组或对象中挑出一个属性,如人物对象数组(或关联数组)中的“名称”,可以使用此函数

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);
}
getter可能用于受保护/私有对象

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

返回

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

应该没有区别
array\u merge()
+
unset()
(如果需要)。请描述您拥有的数据和预期结果,而不是伪代码函数签名。我同意deceze的观点,这个问题需要一个适当的答案。如果这个问题真的完成了,这个页面可以收到更多/更好的答案,并且可以用来关闭未来的副本。现在我发现这个问题还不清楚。但是我需要这样的东西:array\u merge($arr\u 1,$arr\u 2,…$arr\u n),因为
$result
变量可能包含n个关联数组。请给出任何建议。@complex857,在我的例子中,一个数组[array{array1,array2}]中有两个数组,这些数组有相同的参数,但我需要数组{[0]=>array1的内容,[1]=>array2}。在这种情况下,我应该做些什么修改?@NikitaDhiman,我不认为我可以完全按照您的需要来做,但从这里看来,您必须使用
foreach
进行迭代,并通过“手动”来构建所需的结构。感觉就像你在想要的结果周围有一个额外的数组。@complex857,是的,就是这样……一个额外的数组。更像是一个数组,其中包含两个包含相同类型数据的数组。其中的数据必须是merged@NikitaDhiman在这种情况下,如果您知道可以执行的键
$result=$source[0]
,其中
0
是您将拥有的键,或者如果您不知道hey,您可以使用它来获取数组的第一个元素(不管键是什么):
$result=reset($source)
请注意,这实际上不会产生问题中所需的结果…!?
Array
(
    [0] => Ms. Jo
    [1] => Mr. Bob
    [2] => Joey
    [3] => Anna
    [4] => Mr. Howard
    [5] => Ms. Wendle
)