在php中根据3个键(日、月、年)对多维数组进行排序


sort a multidimensional array according to 3 keys (day,month,year) in php

我有一个像这样的多维数组(每个$orders[$userid]数组有多个订单数组)

foreach($orders[$userid] as $order){
    print_r($order);
}

这是第一个用户的订单按日期,月,年分组

Array ( [id] => 409079 [user_id] => 26017 [total] => 30 [final_total] => 29.1 [order_status_id] => 1 
[day] => 1 [month] => 11 [year] => 2016 [amount2] => 2198.2999696731567 )
Array ( [id] => 410744 [user_id] => 26017 [total] => 175 [final_total] => 165 [order_status_id] => 1 
[day] => 2 [month] => 11 [year] => 2016 [amount2] => 2619.799982070923 )
Array ( [id] => 412268 [user_id] => 26017 [total] => 300 [final_total] => 293 [order_status_id] => 1 
[day] => 3 [month] => 11 [year] => 2016 [amount2] => 4413.400000572205 )
Array ( [id] => 405860 [user_id] => 26017 [total] => 10 [final_total] => 9.8 [order_status_id] => 1 
[day] => 30 [month] => 10 [year] => 2016 [amount2] => 352.5999994277954 )
Array ( [id] => 407500 [user_id] => 26017 [total] => 85 [final_total] => 84.5 [order_status_id] => 1 
[day] => 31 [month] => 10 [year] => 2016 [amount2] => 1135.1000022888184 )

如您所见,较旧的日期显示在最近日期之后。问题是如何排序这个多维数组以显示旧日期然后显示最近日期,如

Array ( [id] => 405860 [user_id] => 26017 [total] => 10 [final_total] => 9.8 [order_status_id] => 1 
[day] => 30 [month] => 10 [year] => 2016 [amount2] => 352.5999994277954 )
Array ( [id] => 407500 [user_id] => 26017 [total] => 85 [final_total] => 84.5 [order_status_id] => 1 
[day] => 31 [month] => 10 [year] => 2016 [amount2] => 1135.1000022888184 )
Array ( [id] => 409079 [user_id] => 26017 [total] => 30 [final_total] => 29.1 [order_status_id] => 1 
[day] => 1 [month] => 11 [year] => 2016 [amount2] => 2198.2999696731567 )
Array ( [id] => 410744 [user_id] => 26017 [total] => 175 [final_total] => 165 [order_status_id] => 1 
[day] => 2 [month] => 11 [year] => 2016 [amount2] => 2619.799982070923 )
Array ( [id] => 412268 [user_id] => 26017 [total] => 300 [final_total] => 293 [order_status_id] => 1 
[day] => 3 [month] => 11 [year] => 2016 [amount2] => 4413.400000572205 )

请使用代码:

foreach ($orders as $key => $row) {
    $year[$key]  = $row['year'];
    $month[$key] = $row['month'];
    $day[$key] = $row['day'];
}
array_multisort($year, SORT_ASC, $month, SORT_ASC, $day, SORT_ASC, $orders);

而在更复杂的情况下,您将使用array_multisort,在这种情况下,您可以将问题简化为仅按一个值排序。的'year''month''day'基本上是日期的部分。使用usort函数,您可以执行以下操作:

$dateToTimestamp = function (array $order) {
    $day = $order['day'];
    $month = $order['month'];
    $year = $order['year'];
    return strtotime("$day-$month-$year");
};
usort($array, function ($a, $b) use ($dateToTimestamp) {
    return $dateToTimestamp($a) - $dateToTimestamp($b);
});

使用strtotime需要注意的一点是,您不能真正设置区域设置以识别字符串的哪一部分是日、月或年。在PHP的一个手动注释中,有一个技巧来弥补这一点。在我们的例子中,破折号分隔符的使用确保了顺序。