PHP-如何在数组中合并数组
如何在php中合并n个数组。我的意思是,我该如何做这样的工作: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
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
)