PHP“경고 : usort () [function.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' ) );
기본적으로 함수 이름의 문자열을 보내는 대신 첫 번째 요소가 컨텍스트 (메소드를 찾을 수있는 개체)이고 두 번째 요소는 함수 이름의 문자열입니다. .
노트: 메소드가 정적 인 경우 클래스 이름을 배열의 첫 번째 요소로 전달합니다.
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"));
제휴하지 않습니다 StackOverflow