【问题标题】:Recursively group arrays on multiple keys在多个键上递归分组数组
【发布时间】:2018-02-02 15:38:02
【问题描述】:

我有一个对象数组,例如:

Array
(
    [0] => Array
        (
            [Id] => 1
            [Name] => Toy Car
            [Category] => Toys
            [Price] => 2.99
            [OnSale] => false
        )
    ...
)

但我希望它们按类别分组,然后按 OnSale。

到目前为止,我已经能够使用以下方法按类别分组:

$result = array();
foreach ($data as $element) {
    $result[$element['Category']][] = $element;
}

但我不确定如何嵌套另一个 foreach 或在它们按类别分组后递归分组它们。任何帮助表示赞赏!

【问题讨论】:

  • 如果你模拟一个你想要的示例“最终结果”数组会有所帮助。这样我们就可以准确地知道您的目标并提供更好的帮助。

标签: php arrays recursion


【解决方案1】:

你的意思是:

$result = array();
foreach ($data as $element) {
    $result[$element['Category']][$element['OnSale']][] = $element;
}

编辑:抱歉,[] 都有点问题...

【讨论】:

  • 是的,这绝对有效。谢谢!我不承认这一点而感到愚蠢!如果我想对价格进行排序,我会在 foreach 循环中执行此操作,还是在填充了 $result 数组后执行此操作?
  • 最好在数组制作完成后,在每个类别中按价格排序。
【解决方案2】:

你已经接近了!您只需添加要分组的第二个键。

$byCategoryAndSale = [];
foreach ($inventory as $item) {
    $byCategoryAndSale[$item['Category']][$item['OnSale']][] = $item;
}

注意使用布尔值作为数组键将等同于 1 和 0,这会让人很困惑。

这是一个完整的例子:

<?php
    $inventory = [
        [
            'Id' => 1,
            'Name' => 'Toy Car',
            'Category' => 'Toys',
            'Price' => 2.99,
            'OnSale' => false
        ],
        [
            'Id' => 2,
            'Name' => 'Another Toy',
            'Category' => 'Toys',
            'Price' => 1.99,
            'OnSale' => false
        ],
        [
            'Id' => 3,
            'Name' => 'Hamburger',
            'Category' => 'Not Toys',
            'Price' => 5.99,
            'OnSale' => false
        ],
        [
            'Id' => 4,
            'Name' => 'Last Toy',
            'Category' => 'Toys',
            'Price' => 50.99,
            'OnSale' => true
        ]
    ];

    $byCategoryAndSale = [];
    foreach ($inventory as $item) {
        $byCategoryAndSale[$item['Category']][$item['OnSale']][] = $item;
    }

    print_r($byCategoryAndSale);
?>

产量:

PS C:\> php test.php

(    
    [Toys] => Array
        (
            [0] => Array
                (
                    [0] => Array
                        (
                            [Id] => 1
                            [Name] => Toy Car
                            [Category] => Toys
                            [Price] => 2.99
                            [OnSale] =>
                        )

                    [1] => Array
                        (
                            [Id] => 2
                            [Name] => Another Toy
                            [Category] => Toys
                            [Price] => 1.99
                            [OnSale] =>
                        )

                )

            [1] => Array
                (
                    [0] => Array
                        (
                            [Id] => 4
                            [Name] => Last Toy
                            [Category] => Toys
                            [Price] => 50.99
                            [OnSale] => 1
                        )

                )

        )

    [Not Toys] => Array
        (
            [0] => Array
                (
                    [0] => Array
                        (
                            [Id] => 3
                            [Name] => Hamburger
                            [Category] => Not Toys
                            [Price] => 5.99
                            [OnSale] =>
                        )

                )

        )

)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-15
    • 2017-12-28
    • 2017-11-28
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    相关资源
    最近更新 更多