Skip to content
Advertisement

How to sort multi-dimensional PHP array based on external array value priorities

I have a multi-dimensional array in PHP that looks similar to:

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

I would like to re-sort this array based on name while keeping its structure and data using a sorting array that looks like this:

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

so that the final sort would result in

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

Is uasort() the way to go here? Any code references would be much appreciated.

Advertisement

Answer

You don’t need uasort as you are not trying to preserve keys in the array you are sorting. usort will suffice, passing the $priority array to the callback and sorting based on the priority of each entries name:

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

print_r($my_array_to_sort);

Output:

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

To sort in reverse order, simply change the order of variables in the return expression:

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

Demo on 3v4l.org

User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement