usort изменяет порядок массива - PullRequest
4 голосов
/ 02 сентября 2011

У меня есть функция usort с одной строкой: return 0.
Я пытался использовать его на массиве объектов stdClass, и он меняет
их порядок, как это возможно?

Ответы [ 3 ]

10 голосов
/ 02 сентября 2011

Предполагаемое свойство называется стабильность : алгоритм сортировки stable не изменит порядок элементов, которые равны.

Функции сортировки php не стабильны (потому что нестабильные сортировки могут быть немного быстрее).Из документации usort:

Если два члена сравниваются как равные, их порядок в отсортированном массиве не определен.

Если выЧтобы получить стабильный алгоритм сортировки, вы должны реализовать его самостоятельно .

1 голос
/ 12 сентября 2018

Если вы ищете быстрое решение для стабильной usort, вы можете использовать uksort, как в следующем примере:

<?php

uksort($array, function ($ak, $bk) use ($array) {
    $a = $array[$ak];
    $b = $array[$bk];

    if ($a['foo'] === $b['foo']) 
        return $ak - $bk;

    return $a['foo'] > $b['foo'] ? 1 : -1;
});

Это работает, как и ожидалосьтолько если начальные индексы (ключи) $array находятся в порядке возрастания.

1 голос
/ 02 сентября 2011

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

function sortaaa($a,$b) {return 0;}
$array = array(1,2,3,4,5);
usort($array,"sortaaa");
var_dump($array);
//prints array(5) { [0]=> int(5) [1]=> int(4) [2]=> int(3) [3]=> int(2) [4]=> int(1) }

Похоже, PHP зацикливает массив в обратном порядке в функции usort. Итак, обратите внимание, что руководство usort гласит, что

Если два члена сравниваются как равные, их порядок в отсортированном массиве не определен.

...