PHP usort не сортирует класс

Это пример массива элементов для сортировки:

$items = 
    array
      0 => 
        object(stdClass)[8]
          public 'id' => string '110' (length=3)
          public 'brand_id' => string '18' (length=2)
            array
              0 => string ' OT-708' (length=7)
          public 'failed' => null
          public 'diff' => null
      1 => 
        object(stdClass)[9]
          public 'id' => string '161' (length=3)
          public 'brand_id' => string '18' (length=2)

Итак, допустим, я хочу отсортировать по brand_id. Это моя функция обратного вызова usort:

function _compare($itemA, $itemB){

    if ($itemA->brand_id == $itemB->brand_id) {

        return 0; 
    }
    else{
        return strcmp($itemA->brand_id, $itemB->brand_id); //just an example...
    }

}

И когда я делаю usort($items, '_compare'); var_dump($items); ничего не происходит. Любые подсказки о том, как устранить эту проблему?

--ОБНОВЛЕНИЕ--

Хорошо, я упростил проблему до этого:

function cmp($itemA, $itemB){
    return -1;
}

if (usort($items, "cmp"))
                echo 'I just sorted!';
else echo 'Cant sort!';

Он всегда печатает 'Cort sort!'


person Nacho    schedule 21.06.2011    source источник
comment
brand_name даже не существует в этих объектах.   -  person Matthew    schedule 21.06.2011
comment
Вы печатаете возврат usort или $items? потому что usort возвращает bool только в случае успеха / false в противном случае.   -  person GWW    schedule 21.06.2011
comment
Извините, ребята, я исправил пример.   -  person Nacho    schedule 21.06.2011
comment
Я печатал $items. Я проверю возврат функции сравнения.   -  person Nacho    schedule 21.06.2011
comment
Я обновил вопрос, usort всегда терпит неудачу для меня.   -  person Nacho    schedule 21.06.2011
comment
@ign это if (usort($items, "cmp")), а НЕ if (usort(items, "cmp")), верно?   -  person insumity    schedule 21.06.2011
comment
Да, $items, извините, я уже чувствую себя идиотом.   -  person Nacho    schedule 21.06.2011
comment
@ign ты мог бы сделать var_dump($items); до usort? Он что-нибудь показывает? Или вы не могли бы показать нам больше вашего кода?   -  person insumity    schedule 21.06.2011
comment
ОК, я понял это... Я ошибся, думая, что у меня включены отчеты об ошибках. Весь этот код, включая функцию cmp, находится внутри класса, поэтому я получил это и не понял (!) Предупреждение: usort() ожидает, что параметр 2 будет допустимым обратным вызовом, функция 'cmp' не найдена или неверное имя функции в ...   -  person Nacho    schedule 21.06.2011
comment
@ign, хорошо, что теперь вы можете вставить свое решение проблемы в качестве ответа и принять его для будущих читателей, у которых может быть аналогичная проблема.   -  person insumity    schedule 21.06.2011
comment
Да, я сделаю это, как только SO позволит мне. Спасибо за вашу помощь, без нее мне потребовалось бы больше времени.   -  person Nacho    schedule 21.06.2011


Ответы (3)


Наконец, я обнаружил источник этой ошибки. Проблема заключалась в том, что этот код находился внутри класса.

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

usort($items, array("MyClass", "compare_method"));

Кроме того, если ваш класс находится в пространстве имен, вы должны указать полное пространство имен в usort.

usort($items, array('Full\Namespace\WebPageInformation', 'compare_method'));
person Nacho    schedule 21.06.2011
comment
Спасибо, такая же проблема с уксортом. В документации сказано, что uksort вернет true или false, а возвращал null. - person lolesque; 29.04.2015
comment
Если у кого-то еще есть проблемы, попробуйте сделать функцию сравнения static. - person mightimaus; 17.09.2015
comment
Вы также можете заменить имя класса на $this в качестве первого элемента в массиве. Это эквивалентно $this->compare_method($a, $b), поэтому убедитесь, что для функции установлено значение public. В противном случае usort пытается выполнить MyClass::comapre_method($a, $b), поэтому убедитесь, что функция установлена ​​на static. - person Richard Parnaby-King; 02.09.2016

Кроме того, вы можете установить статическую функцию внутри вашего класса:

static myfunction($a, $b){'yoursort'}

и назовите это так:

usort($items, "Class::myfunction");
person Javier RB    schedule 23.06.2014

Вы также можете использовать $this, если используете usort в Class:

usort($my_array, array($this, 'orderByDate'));
person Sébastien Gicquel    schedule 10.03.2021