Использование usort в php для сортировки массива объектов? - PullRequest
2 голосов
/ 18 февраля 2010

Я посмотрел на usort, но все еще немного растерялся ...

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

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

Ответы [ 3 ]

6 голосов
/ 18 февраля 2010

cmp - это функция callback , которую 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

0 голосов
/ 28 мая 2014

Для получения свойства объекта stdClass используйте оператор -> {'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');
0 голосов
/ 16 февраля 2013

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

Наконец-то я понял, что проблема во внутренней функции uasort. Он не заканчивает сравнение со всеми элементами. Я не помню название используемого алгоритма прямо сейчас, но я сам использую улучшенную версию (моя) в C ++. Алгоритм использует метод сравнения в виде бинарного дерева, разделяя массив на столько пар, сколько требуется при рекурсивном вызове функции сортировки с новыми индексами (нижние, верхние пределы) каждый раз.

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

Я решил эту проблему много лет назад. Я не могу решить это для PHP сейчас, потому что у меня нет компилятора PHP, и у меня также нет исходного кода PHP. Но если кто-нибудь из команды разработчиков PHP свяжется со мной, я могу предоставить рабочую копию этого алгоритма на C ++. Тот же алгоритм является самым быстрым способом доступа к отсортированным элементам.

...