Я смотрел на усорт, но я все еще немного смущен …
Вот как выглядит объект $ myobject:
Array ( [0] => stdClass Object ( [tid] => 13 [vid] => 4 ) [1] => stdClass Object ( [tid] => 10 [vid] => 4 ) [2] => stdClass Object ( [tid] => 34 [vid] => 4 ) [3] => stdClass Object ( [tid] => 9 [vid] => 4 )
Я видел это:
function cmp( $a, $b ) { if( $a->weight == $b->weight ){ return 0 ; } return ($a->weight < $b->weight) ? -1 : 1; } usort($myobject,'cmp');
Я пытаюсь сортировать по тиду, но, полагаю, я просто не уверен, действительно, если мне нужно изменить вес на что-то? Или это будет работать так же, как есть? Я попробовал, но ничего не вышло …
cmp – это функция обратного вызова, которую usort использует для сравнения сложных объектов (например, ваших), чтобы выяснить, как их сортировать. измените cmp для вашего использования (или переименуйте его в любое удобное для вас)
function cmp( $a, $b ) { if( $a->tid == $b->tid ){ return 0 ; } return ($a->tid < $b->tid) ? -1 : 1; } usort($myobject,'cmp'); function sort_by_tid( $a, $b ) { if( $a->tid == $b->tid ){ return 0 ; } return ($a->tid < $b->tid) ? -1 : 1; } usort($myobject,'sort_by_tid');
Я пытаюсь написать функцию сравнения в течение трех часов. На самом деле это очень просто, но я подумал, что я что-то упустил и написал его снова и снова с нуля, изменяя алгоритм во многих отношениях, проверяя его с помощью моего массива образцов.
Наконец я понял, что проблема заключается в внутренней функции uasort. Он не заканчивается по сравнению со всеми элементами. Я не помню имя используемого алгоритма прямо сейчас, но я сам использую улучшенную версию (мой) в C ++. Алгоритм использует метод сравнения двоичного дерева, например, путем деления массива на столько пар, сколько требуется при рекурсивном вызове функции сортировки с новыми индексами (нижний, верхний пределы) каждый раз.
Когда оставшийся фрагмент имеет один элемент, то верхний и нижний индексы одинаковы, и функция считает, что он закончил (обрабатывал все элементы), хотя последний элемент не был оценен. Функции сортировки с использованием этого алгоритма терпят неудачу, когда самый внутренний блок имеет нечетное число. Он отлично работает 2, 4, 8 …. элементов, но не может работать с 3, 5, 7 и т. Д. Точное условие отказа зависит от порядка сортировки элементов. Номера не всегда могут быть значимыми.
Я решил эту проблему много лет назад. Я не могу решить его самостоятельно для PHP сейчас, потому что у меня нет компилятора PHP, и у меня также нет исходного кода PHP. Но если кто-нибудь из команды разработчиков PHP свяжется со мной, я могу предоставить рабочую копию этого алгоритма на C ++. Тот же алгоритм является самым быстрым способом доступа к отсортированным элементам.
Для получения свойства stdClass Object use operator -> {'name_property'}, например $ a -> {'tid'}
function cmp( $a, $b ) { if( $a->{'tid'} == $b->{'tid'} ){ return 0 ; } return ($a->{'tid'} < $b->{'tid'}) ? -1 : 1; } usort($myobject,'cmp'); function sort_by_tid( $a, $b ) { if( $a->{'tid'} == $b->{'tid'} ){ return 0 ; } return ($a->{'tid'} < $b->{'tid'}) ? -1 : 1; } usort($myobject,'sort_by_tid');