按值对平面关联数组的值进行分组以生成二维数组,其中新行包含原始键

问题描述 投票:0回答:2

我有一个以下形式的数组

$a = array(
   'a' => 0,
   'b' => 0,
   'c' => 1
);

并且想要一个以下形式的数组

array(
   0 => array('a','b'),
   1 => array('c')
);

最有效的方法是什么?

php arrays grouping associative-array
2个回答
2
投票

我认为你只需要使用

foreach
,因为
array_flip
会让你丢失重复项:

$b = array();
foreach ($a as $k => $v) {
    $b[$v][] = $k;
}

var_dump($b);

0
投票

这可以通过无体循环来实现,因为在

foreach()
循环签名中,值是在键之前处理的。定义
$v
变量,然后在将原始键作为新子元素推送到结果数组中时,使用该变量作为第一级键。与经典的“主体”循环相比,这种方法使用了更少的变量声明。

代码:(演示

$result = [];
foreach ($a as $result[$v][] => $v);    
var_export($result);

另请参阅:在 foreach() 表达式中,值是在键之前还是之后定义的?


函数式迭代显然不太优雅:(Demo)

var_export(
    array_reduce(
        array_keys($a),
        function ($result, $k) use ($a) {
            $result[$a[$k]][] = $k;
            return $result;
        }
    )
);
© www.soinside.com 2019 - 2024. All rights reserved.