3

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

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

$key有重复的名字,所以当我试图推入$newarray它时,实际上看起来像这样:

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

问题是,上面的例子只是替换了旧值,而不是推入它。

是否可以推动这样的价值观?

4

2 回答 2

13

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

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

您也可以使用array_push(),引入一些开销,但我大部分时间都会坚持使用速记。

于 2012-09-07T22:28:32.147 回答
-1

我将提供一个替代moonwave99 的答案,并解释它是如何微妙地不同的。

以下技术将关联数组的索引数组解包,并将每个子数组作为array_merge_recursive()执行合并“魔术”的单独参数提供服务。

代码:(演示

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

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

当您递归合并时,如果相应键只有一个值,则不使用子数组,如果键有多个值,则使用子数组。

Leek通过取消注释元素来查看此操作。


ps 如果您知道您只针对单列数据并且您知道您所针对的键,那么array_column()这将是一个明智的选择。

代码:(演示

var_export(
    ['Fruit' => array_column($multiarr, 'Fruit')]
);
于 2020-02-14T07:45:20.383 回答