php - 通过自定义日期键对 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() 函数可以有一个自定义函数来排序,但我读过的所有示例都是基于列名的,我没有列名,因为键总是根据用户名、日期、产品名称、状态、票证类型和票证名称。
谁能帮我做到这一点?
解决方案
这可能是您正在寻找的:
$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;
});
}
推荐阅读
- php - 在 Woocommerce 中显示基于发货国家/地区的交货日期范围
- c# - 处理 ListView 内 Html Button 的 onclick 事件
- javascript - 所需的属性不适用于克隆的元素
- powershell - 在不使用其他按钮的情况下激活单选按钮
- css - 加载组件时使用css隐藏/显示类
- javascript - JavaScript 按标签显示/隐藏元素
- ruby-on-rails - RABL 集合在模板中显示为空,但在控制器中不显示
- python - 如何避免 if 条件的重复代码块?
- dataflow - 数据流管道python依赖安装但无法导入
- r - 用 R 中的矩阵列表编写一个文本文件