4

我有一个数组:

[['a', 1], ['b', 1], ['c',2], ['d',2]]

如何根据第二列值对子数组进行分组,如下所示:

[[['a', 1], ['b', 1]], [['c',2], ['d',2]]]

我有一个想法用 foreach 解决这个问题,但它可能有内置函数的方法?

用 foreach 素描:

$in = [['a', 1], ['b', 1], ['c',2], ['d',2]];
$out = [];

foreach($in as $i) {
    $out[$i[1]][] = $i;
}
4

3 回答 3

1

你或多或少有我想要的解决方案。

只要您希望用作索引的数据始终位于数组中的相同位置,您就可以像在收集器数组中那样对索引进行硬编码。

如果没有,我会考虑移动到关联数组并为创建数组时要用作索引的值分配一个名称。

[['a', 'index'=>1] [etc...]]

$out[$i[index]][] = $i;
于 2012-04-10T16:28:52.423 回答
0

没有原生 php 函数可以对索引数组的索引数组的列值进行分组。如果您在谈论关联数组,array_merge_recursive()可能会感兴趣。

演示

基本循环语法:(更简洁,通常更快)

$result = [];
foreach ($array as $row) {
    $result[$row[1]][] = $row;
}
var_export($result);

函数式语法:(更具声明性,没有声明新的全局变量)

var_export(
    array_reduce(
        $array,
        function ($carry, $row) {
            $carry[$row[1]][] = $row;
            return $carry;
        }
    )
);

如果您希望重新索引结果(删除组键),请调用array_values()结果。

于 2021-04-04T00:52:08.447 回答
-1

唯一特定于多维数组的 PHP 内置函数似乎是array_multisort,除非我们可以对输入数组中包含的数据做出假设,否则它不会有太大帮助。

对于小型数据集,您的蛮力示例对我来说似乎很好。

于 2012-04-10T16:30:46.783 回答