如何按列值对子数组进行分组?

107
我有以下数组。
Array
(
    [0] => Array
        (
            [id] => 96
            [shipping_no] => 212755-1
            [part_no] => reterty
            [description] => tyrfyt
            [packaging_type] => PC
        )

    [1] => Array
        (
            [id] => 96
            [shipping_no] => 212755-1
            [part_no] => dftgtryh
            [description] => dfhgfyh
            [packaging_type] => PC
        )

    [2] => Array
        (
            [id] => 97
            [shipping_no] => 212755-2
            [part_no] => ZeoDark
            [description] => s%c%s%c%s
            [packaging_type] => PC
        )

)

我该如何按照id对数组进行分组?是否有可用的原生php函数可以实现此功能?

尽管这种方法可行,但我想使用foreach来实现,因为上面的方法会返回重复的项,而我正试图避免这种情况。

在上面的例子中,id有2个项,所以它需要被放置在id内部。


你是否也想要删除重复的内容? - Baba
大多数解决方案都使用了一个FOREACH循环。 - Justin John
@JustinJohn 大多数解决方案都使用一个FOREACH来创建数组,但最终结果并不是一个数组。我正在寻找更好的解决方案。 - Red
1
你的意思是最终结果不是一维数组。 - Justin John
我的意思是,我需要使用foreach循环已创建的数组,将其转换为HTML元素值。 - Red
21个回答

0

多级分组怎么样?

数据:

$rows = [
    ['country'=>'Japan',  'city'=>'Tokyo', 'surname'=>'Miyazaki', 'name'=>'Hayao'],
    ['country'=>'France', 'city'=>'Paris', 'surname'=>'Godard',   'name'=>'Jean-Luc'],
    ['country'=>'France', 'city'=>'Lyon',  'surname'=>'Godard',   'name'=>'Marguerite'],
    ['country'=>'Japan',  'city'=>'Tokyo', 'surname'=>'Miyazaki', 'name'=>'Akira'],
    ['country'=>'Japan',  'city'=>'Nara',  'surname'=>'Kurosawa', 'name'=>'Akira'],
    ['country'=>'France', 'city'=>'Paris', 'surname'=>'Duras',    'name'=>'Marguerite'],
];
$groups = groupBy($rows, 'country', 'city', 'surname');

代码:

    function groupBy($rows, ...$keys)
    {
        if ($key = array_shift($keys)) {
            $groups = array_reduce($rows, function ($groups, $row) use ($key) {
                $group = is_object($row) ? $row->{$key} : $row[$key]; // object is available too.
                $groups[$group][] = $row;
                return $groups;
            }, []);
            if ($keys) {
                foreach ($groups as $subKey=>$subRows) {
                    $groups[$subKey] = self::groupBy($subRows, ...$keys);
                }
            }
        }
        return $groups;
    }

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