我有一个以下形式的数组
$a = array(
'a' => 0,
'b' => 0,
'c' => 1
);
并且想要一个以下形式的数组
array(
0 => array('a','b'),
1 => array('c')
);
最有效的方法是什么?
我认为你只需要使用
foreach
,因为array_flip
会让你丢失重复项:
$b = array();
foreach ($a as $k => $v) {
$b[$v][] = $k;
}
var_dump($b);
这可以通过无体循环来实现,因为在
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;
}
)
);