我有以下数组:
数组( [1] => 数组 ( [0] => 数组 ( [类] => 高级嘻哈年龄 10+ [会话] => 0 [开始] => 1436902200 [完] => 1436905800 [容量] => [学生] => 1 ) [1] => 数组 ( [类] => 中级嘻哈年龄 9+ [会话] => 0 [开始] => 1436899500 [完] => 1436902200 [容量] => [学生] => 1 ) [2] => 数组 ( [类] => 开始足尖年龄 10+ [会话] => 0 [开始] => 1436896800 [完] => 1436899500 [容量] => [学生] => 1 ) [3] => 数组 ( [类] => 国际/高级芭蕾舞年龄 10+ [会话] => 0 [开始] => 1436889600 [完] => 1436896800 [容量] => 15 [学生] => 1 ) [4] => 数组 ( [类] => 初级芭蕾舞 8+ 岁 [会话] => 0 [开始] => 1436884200 [完] => 1436891400 [容量] => 15 [学生] => 1 ) ) [2] => 数组 ( [0] => 数组 ( [类] => 中级技术/进阶 年龄 9+ [会话] => 0 [开始] => 1436899500 [完] => 1436904900 [容量] => [学生] => 1 ) [1] => 数组 ( [类] => 国际/高级点击年龄 9+ [会话] => 0 [开始] => 1436895900 [完] => 1436899500 [容量] => [学生] => 1 ) [2] => 数组 ( [类] => 初级爵士/当代技术 年龄 8+ [会话] => 0 [开始] => 1436887800 [完] => 1436893200 [容量] => [学生] => 1 ) ) [3] => 数组 ( [0] => 数组 ( [类] => 国际/高级爵士 9+ [会话] => 0 [开始] => 1436893200 [完] => 1436898600 [容量] => [学生] => 1 ) [1] => 数组 ( [类] => 国际/高级芭蕾芭蕾 芭蕾 年龄 9+ [会话] => 0 [开始] => 1436886000 [完] => 1436889600 [容量] => [学生] => 1 ) ))
我想按开始时间对数组的第三级(类(进行排序。我已经尝试了这里建议的两级数组的许多不同的解决方案,但无济于事。
我最近的尝试是:
array_walk($schedule, 'walk_cmp');
function walk_cmp($array, $key){
usort($array, function($a, $b) {
return ($a['start'] > $b['start']) ? -1: 1;
});
}
我已经确认排序在walk_cmp
内有效,但对数组的这些更改不会反映在主数组中。
我觉得我一定错过了一些明显的东西,但我在这里。请记住,这是一个本质上是动态的示例数组。它将始终具有此结构,但第二个(Day(和第三个(Class(数组中的元素数量会有所不同。
您的尝试看起来不错,并且您也非常接近解决方案!
您的主要问题是,您将函数中的数组作为局部变量进行排序。因此,您的原始阵列不会更改。您必须通过引用传递数组。因此,您的代码将如下所示:
array_walk($schedule, "walk_cmp");
function walk_cmp(&$array, $key) {
//^ See here
uasort($array, function($a, $b) {
if($a['start'] == $b['start']) //If they are the same, return 0
return 0;
return ($a['start'] > $b['start']) ? -1 : 1;
});
}
有一些简洁而现代的方法可以做到这一点:
-
array_walk()
array_multisort()
和array_column()
:(演示(array_walk($array, function(&$v) { array_multisort(array_column($v, 'start'), $v); });
这会在迭代数组的第一级时通过引用进行修改,然后根据第三级中的目标列对第二级进行排序。
array_multisort()
也通过引用进行修改。 -
array_walk()
与usort()
和三向比较运算符(亲切地称为"宇宙飞船操作员"((演示(array_walk($array, function(&$a1) { usort($a1, function($a2, $b2) { return $a2['start'] <=> $b2['start']; }); });
从 PHP7.4 开始,箭头函数语法可用于减少整体语法。(演示(
array_walk($array, function(&$a1) { usort($a1, fn($a2, $b2) => $a2['start'] <=> $b2['start']); });
您甚至可以减少
array_walk()
语法以形成单行:(演示(array_walk($array, fn(&$a1) => usort($a1, fn($a2, $b2) => $a2['start'] <=> $b2['start'])); // array_walk silently ignores the data returned by the "arrow"