PHP将值推送到关联数组中


PHP push values into associative array

我在任何地方都找不到答案。

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')]
);