클래스 개인 함수와 함께 php에서 usort 사용

ok 기능과 함께 usort를 사용하는 것은 그다지 복잡하지 않다.

이건 내가 전에 가지고 있던 선형 코드야

function merchantSort($a,$b){
return ....// stuff; }
$array = array('..','..','..'); 

간단히 말하자면

usort($array,"merchantSort"); 

이제 코드를 업그레이드하고 모든 글로벌 기능을 제거하여 적절한 위치에 배치합니다.이제 모든 코드가 클래스에 포함되어 있습니다.usort 함수를 사용하여 단순한 함수 대신 객체 메서드인 매개 변수를 사용하여 어레이를 정렬하는 방법을 알 수 없습니다.

class ClassName {
...
private function merchantSort($a,$b) {
return ...// the sort
}
public function doSomeWork() {
...
$array = $this->someThingThatReturnAnArray();
usort($array,'$this->merchantSort'); // ??? this is the part i can't figure out
...
} } 

문제는 usort() 함수 내의 오브젝트 메서드를 호출하는 방법입니다.



질문에 대한 답변



정렬 함수를 정적으로 설정합니다.

private static function merchantSort($a,$b) {
return ...// the sort } 

두 번째 파라미터에는 배열을 사용합니다.

$array = $this->someThingThatReturnAnArray(); usort($array, array('ClassName','merchantSort')); 



  1. 매뉴얼 페이지 http://www.php.net/usort를 엽니다.
  2. 의 타입을 확인하다$value_compare_funccallable
  3. 링크된 키워드를 클릭하여 http://php.net/manual/en/language.types.callable.php에 접속합니다.
  4. 구문이 다음과 같은 것을 알 수 있다array($this, 'merchantSort')



합격해야 합니다.$this예:usort( $myArray, array( $this, 'mySort' ) );

완전한 예:

class SimpleClass {


function getArray( $a ) {

usort( $a, array( $this, 'nameSort' ) ); // pass $this for scope
return $a;
}

private function nameSort( $a, $b )
{
return strcmp( $a, $b );
}

}
$a = ['c','a','b'];
$sc = new SimpleClass(); print_r( $sc->getArray( $a ) ); 



이 예에서는 AverageVote라는 배열 내의 필드를 기준으로 정렬하고 있습니다.

메서드를 콜에 포함할 수 있습니다.즉, 클래스 스코프의 문제가 없어집니다.이렇게 하면…


usort($firstArray, function ($a, $b) {
if ($a['AverageVote'] == $b['AverageVote']) {

return 0;
}
 return ($a['AverageVote'] < $b['AverageVote']) ? -1 : 1;
}); 



Laravel (5.6) 모델 클래스에서는 이렇게 불렀습니다.두 방법 모두 public static이며 Windows 64비트에서 php 7.2를 사용합니다.

public static function usortCalledFrom()
public static function myFunction() 

이렇게 usortCalledFrom()을 호출했습니다.

usort($array,"static::myFunction") 

이 중 어느 것도 일이 아니었다.

usort($array,"MyClass::myFunction") usort($array, array("MyClass","myFunction")