按列值对子数组进行分组

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;
}

2
你想要始终将它分成两半还是每组两个? - Kasapo
@Kasapo 不可以。它可以分成许多部分。 - Ticksy
@Lübnah 关于内置函数列表,我知道。但在这个任务中,我不知道如何使用它们。而且这是否可能。你能否重新表述你的第一个问题?很遗憾,我不理解。 - Ticksy
如果内部数组中的第二个元素始终指向它所属的“列”的索引,则您的解决方案是正确的。我真的不认为有任何内置的东西可以做到这一点。 - Kasapo
1
这是一个数组分组问题,你的方法是正确的,假设你没有构建 $in(如果你有,请构建它分组)。更多信息请参见 https://dev59.com/YnI95IYBdhLWcg3wtwRe - connec
显示剩余3条评论
3个回答

1

你的解决方案基本上和我想到的一样。

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

如果不是这样,我会考虑转移到关联数组,并在创建数组时为要用作索引的值分配一个名称。

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

$out[$i[index]][] = $i;

需要保留你用作索引的值吗? - Malovich

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()

-1
唯一特定于多维数组的 PHP 内置函数似乎是 array_multisort,除非我们可以对输入数组中包含的数据做出某些假设,否则它将没有太大帮助。
在小数据集的情况下,您的暴力示例对我来说很不错。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接