首页 > 解决方案 > 通过自定义日期键对 PHP 多维数组进行排序

问题描述

我有以下数组:

    Array
(
    [Sir Ruane] => Array
        (
            [2018-07-03] => Array
                (
                    [Product 1] => Array
                        (
                            [Paid] => Array
                                (
                                    [Ticket] => Array
                                        (
                                            [Standard] => Array
                                                (
                                                    [quantity] => 6
                                                    [asistance] => 6
                                                )

                                        )

                                )

                        )

                )

            [2018-07-01] => Array
                (
                    [Product 1] => Array
                        (
                            [Paid] => Array
                                (
                                    [Ticket] => Array
                                        (
                                            [Standard] => Array
                                                (
                                                    [quantity] => 2
                                                    [asistance] => 2
                                                )

                                        )

                                )

                        )

                )

            [2018-07-06] => Array
                (
                    [Product 1] => Array
                        (
                            [Paid] => Array
                                (
                                    [Ticket] => Array
                                        (
                                            [Standard] => Array
                                                (
                                                    [quantity] => 5
                                                    [asistance] => 5
                                                )

                                        )

                                )

                        )

                )

        )
)

我正在尝试按日期格式的键对数组进行排序,因为它们是按日期顺序升序打印的

像这样:

客户名称 -> 日期(按降序排列)-> 产品 -> 状态 -> 等。

我尝试了以下方法,因为我在 Stackoverflow 社区的另一篇文章中阅读过它:

 array_multisort( array_column($array, $array[0][0]), SORT_ASC, $array );

但这给了我首先编写的数组。

我还尝试了其他函数,如 ksort()、sort()、usort(),但没有任何我想要实现的功能。

我也读过 sort() 函数可以有一个自定义函数来排序,但我读过的所有示例都是基于列名的,我没有列名,因为键总是根据用户名、日期、产品名称、状态、票证类型和票证名称。

谁能帮我做到这一点?

标签: phparraysmultidimensional-array

解决方案


这可能是您正在寻找的:

$array=
 Array
(
    "Sir Ruane" => Array
        (
            "2018-07-03" => Array
                (
                    "Product 1" => Array
                        (
                            "Paid" => Array
                                (
                                    "Ticket" => Array
                                        (
                                            "Standard" => Array
                                                (
                                                    "quantity" => 6,
                                                    "asistance" => 6
                                                )

                                        )

                                )

                        )

                ),

            "2018-07-01" => Array
                (
                    "Product 1" => Array
                        (
                            "Paid" => Array
                                (
                                    "Ticket" => Array
                                        (
                                            "Standard" => Array
                                                (
                                                    "quantity" => 2,
                                                    "asistance" => 2
                                                )

                                        )

                                )

                        )

                ),

            "2018-07-06" => Array
                (
                    "Product 1" => Array
                        (
                            "Paid" => Array
                                (
                                    "Ticket" => Array
                                        (
                                            "Standard" => Array
                                                (
                                                    "quantity" => 5,
                                                    "asistance" => 5
                                                )

                                        )

                                )

                        )

                )

        )
);
reset($array);
list($k,$v)=each($array);
uksort($array[$k],function ($a,$b){
    list($a_year,$a_month,$a_day)=explode('-',$a);
    list($b_year,$b_month,$b_day)=explode('-',$b);
    if($a_year>$b_year) return -1;
    if($a_year<$b_year) return 1;
    if($a_month>$b_month) return -1;
    if($a_month<$b_month) return 1;
    if($a_day>$b_day) return -1;
    if($a_day<$b_day) return 1;
    return 0;
});
print_r($array);

输出是:

Array
(
    [Sir Ruane] => Array
        (
            [2018-07-06] => Array
                (
                    [Product 1] => Array
                        (
                            [Paid] => Array
                                (
                                    [Ticket] => Array
                                        (
                                            [Standard] => Array
                                                (
                                                    [quantity] => 5
                                                    [asistance] => 5
                                                )

                                        )

                                )

                        )

                )

            [2018-07-03] => Array
                (
                    [Product 1] => Array
                        (
                            [Paid] => Array
                                (
                                    [Ticket] => Array
                                        (
                                            [Standard] => Array
                                                (
                                                    [quantity] => 6
                                                    [asistance] => 6
                                                )

                                        )

                                )

                        )

                )

            [2018-07-01] => Array
                (
                    [Product 1] => Array
                        (
                            [Paid] => Array
                                (
                                    [Ticket] => Array
                                        (
                                            [Standard] => Array
                                                (
                                                    [quantity] => 2
                                                    [asistance] => 2
                                                )

                                        )

                                )

                        )

                )

        )

)

当然,如果您有更多客户,您可以通过这种方式将代码放入循环中:

reset($array);
while(list($k,$v)=each($array)){
uksort($array[$k],function ($a,$b){
    list($a_year,$a_month,$a_day)=explode('-',$a);
    list($b_year,$b_month,$b_day)=explode('-',$b);
    if($a_year>$b_year) return -1;
    if($a_year<$b_year) return 1;
    if($a_month>$b_month) return -1;
    if($a_month<$b_month) return 1;
    if($a_day>$b_day) return -1;
    if($a_day<$b_day) return 1;
    return 0;
});
}

推荐阅读