Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在没有父ID的情况下,如何在PHP中使这个平面数组分层?_Php_Arrays_Recursion_Hierarchical Data - Fatal编程技术网

在没有父ID的情况下,如何在PHP中使这个平面数组分层?

在没有父ID的情况下,如何在PHP中使这个平面数组分层?,php,arrays,recursion,hierarchical-data,Php,Arrays,Recursion,Hierarchical Data,我有一个平面数组结构($rows)和一个列数组($groupByCols),我希望通过该数组对数据进行分组: $groupByCols = ['a', 'b']; $rows = [ [ 'a' => 1, 'b' => 10, 'c' => 100 ], [ 'a' => 1, 'b' => 20, 'c' => 200 ],

我有一个平面数组结构(
$rows
)和一个列数组(
$groupByCols
),我希望通过该数组对数据进行分组:

$groupByCols = ['a', 'b'];
$rows = [
    [
        'a' => 1,
        'b' => 10,
        'c' => 100
    ],
    [
        'a' => 1,
        'b' => 20,
        'c' => 200
    ],
    [
        'a' => 1,
        'b' => 20,
        'c' => 300
    ],
    [
        'a' => 1,
        'b' => 30,
        'c' => 400
    ],
    [
        'a' => 2,
        'b' => 40,
        'c' => 500
    ],
    [
        'a' => 2,
        'b' => 50,
        'c' => 600
    ],
    [
        'a' => 3,
        'b' => 60,
        'c' => 700
    ]
];
通过循环遍历
$rows
变量并按顺序引用每个
$groupByCols
值,我希望得到以下层次结构数组:

$groupedRows = [
    [
        [
            [
                'a' => 1,
                'b' => 10,
                'c' => 100
            ]
        ],
        [
            [
                'a' => 1,
                'b' => 20,
                'c' => 200
            ],
            [
                'a' => 1,
                'b' => 20,
                'c' => 300
            ]
        ],
        [
            [
                'a' => 1,
                'b' => 30,
                'c' => 400
            ]
        ]
    ],
    [
        [
            [
                'a' => 2,
                'b' => 40,
                'c' => 500
            ]
        ],
        [
            [
                'a' => 2,
                'b' => 50,
                'c' => 600
            ]
        ]
    ],
    [
        [
            [
                'a' => 3,
                'b' => 60,
                'c' => 700
            ]
        ]
    ]
];
我99%确信我需要使用递归来实现这一点,但在尝试了10种不同的方法(没有一种有效)之后,我无法想出如何得到我想要的

通常情况下,我会分享到目前为止我写的代码,但是在考虑了几天之后,我真的没有什么东西可以展示

我想我只需要一些关于如何递归使用
$groupByCols
$rows
变量来获取
$groupedRows
数组的一般指导。如蒙协助,将不胜感激

此外,请注意,出于演示目的,上述数据非常简单。实际数据可能会无限长且更复杂,根据所需内容的性质,我可能需要使用
$groupByCols
进行5-6级


谢谢。

此功能将满足您的需要。它遍历数组,按
$columns
中第一个值索引的值进行分组。如果
$columns
数组中还有列,它将按这些列递归分组。为了避免出现奇数键,它调用
array\u values
将结果重新索引为从0开始的数字键

function group_by($array, $columns) {
    $new_arr = array();
    $column = array_shift($columns);
    foreach ($array as $arr) {
        $new_arr[$arr[$column]][] = $arr;
    }
    if (count($columns)) {
        foreach ($new_arr as &$arr) {
            $arr = group_by($arr, $columns);
        }
    }
    return array_values($new_arr);
}
print_r(group_by($rows, $groupByCols));

输出结果如您所愿,但与其把答案打印得太长,不如看演示。

太好了,尼克。非常感谢。你知道,在我的一次尝试中,我实际上有一些非常接近的东西,我没有意识到我就快到了。我缺少的主要内容是引用数组的
&
。该死!不过再次谢谢你。救命恩人!是的,我知道怎么回事。很高兴我能帮忙。