我在任何地方都找不到答案。
foreach ($multiarr as $array) {
foreach ($array as $key=>$val) {
$newarray[$key] = $val;
}
}
假设$key
有重复的名称,所以当我试图推入$newarray
时,它实际上看起来是这样的:
$newarray['Fruit'] = 'Apples';
$newarray['Fruit'] = 'Bananas';
$newarray['Fruit'] = 'Oranges';
问题是,上面的例子只是替换旧值,而不是推入它。
有可能像这样推动价值观吗?
是的,注意新的一对方括号:
foreach ($multiarr as $array) {
foreach ($array as $key=>$val) {
$newarray[$key][] = $val;
}
}
您也可以使用array_push()
,这会带来一些开销,但我大部分时间都会使用简写。
我将提供一个moonwave99答案的替代方案,并解释它是如何微妙地不同的。
以下技术打开关联数组的索引数组,并将每个子数组作为执行合并"魔术"的array_merge_recursive()
的单独参数。
代码:(演示)
$multiarr = [
['Fruit' => 'Apples'],
['Fruit' => 'Bananas'],
['Fruit' => 'Oranges'],
['Veg' => 'Carrot'],
//['Veg' => 'Leek'],
];
var_export(
array_merge_recursive(...$multiarr)
);
递归合并时,如果一个键只有一个值,则不使用子数组;如果一个密钥有多个值,那么使用子数组。
请通过取消对Leek
元素的注释来查看此操作。
p.s.如果你知道你只针对一列数据,并且你知道你要针对的密钥,那么array_column()
将是一个明智的选择。
代码:(演示)
var_export(
['Fruit' => array_column($multiarr, 'Fruit')]
);