将值推入关联数组的PHP代码

3
我在任何地方都找不到答案。
foreach ($multiarr as $array) {
   foreach ($array as $key=>$val) {
      $newarray[$key] = $val;
   }
}

假设 $key 存在重复的名称,因此当我尝试将其推入 $newarray 中时,实际上会变成这样:

$newarray['Fruit'] = 'Apples';
$newarray['Fruit'] = 'Bananas';
$newarray['Fruit'] = 'Oranges';

问题在于,上面的例子只是替换了旧值,而不是将其推入其中。
是否可能像这样推送值?
2个回答

13

是的,请注意新的一对方括号:

foreach ($multiarr as $array) {
   foreach ($array as $key=>$val) {
      $newarray[$key][] = $val;
   }
}

您还可以使用array_push(),这会增加一些开销,但我大部分时间都会坚持使用缩写。


0

我将提供一个替代moonwave99答案的方案,并解释其微妙之处。

以下技巧展开了关联数组的索引数组,并将每个子数组作为单独的参数提供给array_merge_recursive(),后者执行合并“魔法”。

代码:(演示)

$multiarr = [
    ['Fruit' => 'Apples'],
    ['Fruit' => 'Bananas'],
    ['Fruit' => 'Oranges'],
    ['Veg'   => 'Carrot'],
    //['Veg'   => 'Leek'],
];

var_export(
    array_merge_recursive(...$multiarr)
);

在递归合并时,如果对应的键只有一个值,则不使用子数组,如果对于一个键有多个值,则使用子数组。

取消注释 Leek 元素以查看此操作。


附言:如果您知道您只针对单个数据列,并且您知道您要针对的键,则使用array_column()是一个明智的选择。

代码:(演示

var_export(
    ['Fruit' => array_column($multiarr, 'Fruit')]
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接