首页 > 解决方案 > 如何根据外部数组值优先级对多维PHP数组进行排序

问题描述

我在 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() 是去这里的路吗?任何代码参考将不胜感激。

标签: phparrayssortingmultidimensional-array

解决方案


您不需要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']];
});

3v4l.org 上的演示


推荐阅读