如何使用 array_walk 在 PHP 中对三维数组进行排序



我有以下数组:

数组(    [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;
    });
}

有一些简洁而现代的方法可以做到这一点:

  1. array_walk() array_multisort()array_column():(演示(

    array_walk($array, function(&$v) {
        array_multisort(array_column($v, 'start'), $v);
    });
    

    这会在迭代数组的第一级时通过引用进行修改,然后根据第三级中的目标列对第二级进行排序。 array_multisort()也通过引用进行修改。

  2. 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"
    

相关内容

  • 没有找到相关文章

最新更新