Я пытался написать функцию сравнения в течение трех часов. На самом деле это очень просто, но я подумал, что что-то упустил, и снова и снова писал это с нуля, меняя алгоритм во многих отношениях, тестируя его с моим образцом массива.
Наконец-то я понял, что проблема во внутренней функции uasort. Он не заканчивает сравнение со всеми элементами. Я не помню название используемого алгоритма прямо сейчас, но я сам использую улучшенную версию (моя) в C ++. Алгоритм использует метод сравнения в виде бинарного дерева, разделяя массив на столько пар, сколько требуется при рекурсивном вызове функции сортировки с новыми индексами (нижние, верхние пределы) каждый раз.
Когда оставшийся фрагмент состоит из одного элемента, верхний и нижний индексы совпадают, и функция считает, что она завершилась (обработала все элементы), хотя последний элемент не был оценен. Сортировка функций с использованием этого алгоритма завершается ошибкой, когда самый внутренний блок имеет нечетное число. Он отлично работает с 2, 4, 8 .... элементами, но не может работать с 3, 5, 7 и т. Д. Точное условие сбоя зависит от порядка сортировки элементов. Числа не всегда могут быть значимыми.
Я решил эту проблему много лет назад. Я не могу решить это для PHP сейчас, потому что у меня нет компилятора PHP, и у меня также нет исходного кода PHP. Но если кто-нибудь из команды разработчиков PHP свяжется со мной, я могу предоставить рабочую копию этого алгоритма на C ++. Тот же алгоритм является самым быстрым способом доступа к отсортированным элементам.