PHP “Предупреждение:usort() [функция.usort]:Недопустимая функция сравнения” при сортировке

StackOverflow https://stackoverflow.com/questions/1229324

Вопрос

у меня есть следующие данные в виде ассоциативного массива

array
  'abc' => 
    array
      'label' => string 'abc' (length=3)
      'weight' => float 3
  'wsx' => 
    array
      'label' => string 'wsx' (length=3)
      'weight' => float 1
  'qay' => 
    array
      'label' => string 'qay' (length=3)
      'weight' => float 1
  'http://test.com' => 
    array
      'label' => string 'http://test.com' (length=15)
      'weight' => float 0
  'Nasi1' => 
    array
      'label' => string 'Nasi1' (length=5)
      'weight' => float 0
  'fax' => 
    array
      'label' => string 'fax' (length=3)
      'weight' => float 4

Я хочу отсортировать массив с помощью "метки" или "веса".

Функция сравнения для метки является:

function compare_label($a, $b)
{
    return strnatcmp($a['label'], $b['label']);
}

и тогда я просто вызываю функцию из другой функции:

usort($label, 'compare_label');
var_dump($label);

но затем я получаю сообщение об ошибке, и массив не отсортирован.Я не знаю, что я делаю не так.Я пытался заменить:

  • usort($label, 'compare_label'); с usort($label, compare_label);
  • usort($label, 'compare_label'); с usort($label, $this->compare_label);

безуспешно.Кто-нибудь может дать мне подсказку?

Это было полезно?

Решение

если compare_label является функцией-членом (т.Е. методом класса), то вам нужно передать ее по-другому.

usort( $label, array( $this, 'compare_label' ) );

По сути, вместо того, чтобы просто отправлять строку с именем функции, вы отправляете массив из двух элементов, где первым элементом является контекст (объект, в котором можно найти метод), а 2-й элемент - строка с именем функции.

ПРИМЕЧАНИЕ: Если ваш метод статичен, то вы передаете имя класса в качестве первого элемента массива

usort( $label, array( __CLASS__, 'compare_label' ) );

Другие советы

Определяется ли функция сравнения как глобальная функция или как метод объекта?Если это метод, вам придется немного изменить способ его вызова:

usort($label, array($object, "compare_label")); 

Вы также можете объявить его как статический метод самого класса:

public static function compare_label ($a, $b) {
   [...]
}

usort($label, array(Class_Name, "compare_label"));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top