PHP "Предупреждение: usort () [function.usort]: недопустимая функция сравнения" при сортировке - PullRequest
4 голосов
/ 04 августа 2009

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

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

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

Ответы [ 2 ]

21 голосов
/ 04 августа 2009

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

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

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

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

usort( $label, array( __CLASS__, 'compare_label' ) );
1 голос
/ 04 августа 2009

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

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

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

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

usort($label, array(Class_Name, "compare_label"));
...