Сортировка массива и сохранение значений ключей

У меня есть массив, который выглядит так:

Array
(
    [team1] => Array
        (
            [points] => 10
            [players] => Array
                (
                     ...
                )
        )

    [team2] => Array
        (
            [points] => 23
            [players] => Array
                (
                     ...
                )
        )

    ... many more teams
)

и я хотел бы сортировать команды по количеству очков, которые у каждой команды есть. Я пробовал это:

function sort_by_points($a,$b)
{
    if ($a['points']==$b['points']) return 0;
        return ($a['points']<$b['points'])?1:-1;
}

usort($this->wordswithdata, "sortbycount");

Но этот подход отменяет ключи, содержащие имена команд и возвращает:

Array
(
    [0] => Array
        (
            [points] => 23
            [players] => Array
                (
                     ...
                )
        )

    [1] => Array
        (
            [points] => 10
            [players] => Array
                (
                     ...
                )
        )

    etc...
)

Есть ли способ отсортировать массив без перезаписи имен команд в виде ключей массива?

Ответ 1

Используйте функцию uasort, которая должна поддерживать целостность ключей = > значение.

(сторона примечания: вы можете сделать return $a['points'] - $b['points'] вместо ifs)

Ответ 2

Вы можете использовать uasort:

uasort($array, function($a, $b) {
    return $a['points'] - $b['points'];
});

Эта функция сортирует массив таким образом, что индексы массива сохраняют свою корреляцию с элементами массива, с которыми они связаны, используя пользовательскую функцию сравнения.

Ответ 3

Попробуйте этот код, надеюсь, он сработает.

function aasort (&$array, $key) {
    $sorter=array();
    $ret=array();
    reset($array);
    foreach ($array as $ii => $va) {
        $sorter[$ii]=$va[$key];
    }
    asort($sorter);
    foreach ($sorter as $ii => $va) {
        $ret[$ii]=$array[$ii];
    }
    $array=$ret;
}

aasort($your_array,"points");