在PHP中按列拆分二维数组

时间:2012-04-10 16:12:50

标签: php arrays foreach split

我有一个数组:

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

3 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)

唯一特定于多维数组的PHP内置似乎是array_multisort,除非我们可以对输入数组中包含的数据做出假设,否则这将没有多大帮助。 / p>

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

答案 2 :(得分:0)

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

(Demo)

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

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