【问题标题】:How to sort multi-dimensional PHP array based on external array value priorities如何根据外部数组值优先级对多维PHP数组进行排序
【发布时间】:2020-09-09 01:00:23
【问题描述】:

我在 PHP 中有一个多维数组,看起来类似于:

$my_array_to_sort = [
    "data" => [
        [
            "name" => "orange",
            "id" => 23423,
        ],
        [
            "name" => "green",
            "id" => 34343,
        ],
        [
            "name" => "red",
            "id" => 65566,
        ],
    ],
];

我想根据名称重新排序此数组,同时使用如下所示的排序数组保留其结构和数据:

$priority = [
    "red" => 1,
    "orange" => 2,
    "green" => 3,
];

这样最终的排序会产生

Array
(
    [data] => Array
        (
            [0] => Array
                (
                    [name] => red
                    [id] => 65566
                )
            [1] => Array
                (
                    [name] => orange
                    [id] => 23423
                )
            [2] => Array
                (
                    [name] => green
                    [id] => 34343
                )
        )
)   

是 uasort() 去这里的方式吗?任何代码参考将不胜感激。

【问题讨论】:

    标签: php arrays sorting multidimensional-array


    【解决方案1】:

    您不需要uasort,因为您没有尝试保留正在排序的数组中的键。 usort 就足够了,将 $priority 数组传递给回调并根据每个条目名称的优先级进行排序:

    usort($my_array_to_sort['data'], function ($a, $b) use ($priority) {
        return $priority[$a['name']] - $priority[$b['name']];
    });
    
    print_r($my_array_to_sort);
    

    输出:

    Array
    (
        [data] => Array
            (
                [0] => Array
                    (
                        [name] => red
                        [id] => 65566
                    )
                [1] => Array
                    (
                        [name] => orange
                        [id] => 23423
                    )
                [2] => Array
                    (
                        [name] => green
                        [id] => 34343
                    )
            )
    )
    

    要逆序排序,只需更改return表达式中变量的顺序:

    usort($my_array_to_sort['data'], function ($a, $b) use ($priority) {
        return $priority[$b['name']] - $priority[$a['name']];
    });
    

    Demo on 3v4l.org

    【讨论】:

    • 这很棒。谢谢你。如果我需要逆序排序(最高优先级值在前,即 3、2、1 等)
    • @yesinteractive 只是反转参数比较,return $priority[$b['name']] - $priority[$a['name']]; 会降序排列
    • @Kevin 感谢您回答 OP 评论。我会用这个更新答案。
    • 是的,这回答了这个问题。 tysm
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2013-11-25
    相关资源
    最近更新 更多