PHP “Предупреждение:usort() [функция.usort]:Недопустимая функция сравнения” при сортировке
-
22-07-2019 - |
Вопрос
у меня есть следующие данные в виде ассоциативного массива
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"));