Использование usort в php для сортировки массива объектов?

Я смотрел на усорт, но я все еще немного смущен …

Вот как выглядит объект $ 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'); 

Я пытаюсь сортировать по тиду, но, полагаю, я просто не уверен, действительно, если мне нужно изменить вес на что-то? Или это будет работать так же, как есть? Я попробовал, но ничего не вышло …

Related of "Использование usort в php для сортировки массива объектов?"

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'); 

http://www.php.net/usort

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

Наконец я понял, что проблема заключается в внутренней функции 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');