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


119

좋아요 함수와 함께 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 () 함수 내에서 객체 메서드를 호출하는 방법입니다.

답변:


228

정렬 기능을 정적으로 만드십시오.

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

그리고 두 번째 매개 변수에 배열을 사용합니다.

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

2
이것은 대단합니다! 또한 정렬 함수를 정적 메서드로 암시 적 으로 선언 할 필요가 없다는 점을 지적하고 싶습니다 . 여전히 :)없이 작동으로
짐보

@Jimbo-의미가 있으므로 private 함수는 인스턴스화 및 클래스 변수를 사용할 수 있습니다. 네, 좋습니다! 통과 할 수있는 @deceze 답변 $this(neato) 도 참조하세요 .
Ben

5
함수를 정적으로 만들면 (당신이해야하는) 그냥 쓸 usort($array, 'ClassName:merchantSort')수 있지 않나요?
caw

8
이건 정말 이상한 방법 인 것 같아요. 오 PHP, 우리가 당신을 얼마나 사랑하는지.
dudewad 2013

12
@MarcoW., ClassName과 merchantSort 사이에 두 번째 ':'가 누락 된 것 같습니다. 또한 함수가 동일한 클래스 자체 내에서 사용되는 경우 테스트를 거쳐 'self::merchantSort'작동합니다.
Pere


21

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

이제 두 번째 섹션이 훨씬 좋아졌습니다. 그러나 첫 번째 예에서 여전히 ")"가 누락되었습니다.
codescribblr 2014

5

이 예에서는 AverageVote라는 배열 내부의 필드를 기준으로 정렬합니다.

호출 내에 메서드를 포함 할 수 있습니다. 즉, 다음과 같이 더 이상 클래스 범위 문제가 발생하지 않습니다.

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

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

1
이 기능을 이런 종류로만 사용하는 경우에만 의미가 있습니다. 많은 경우 동일한 비교가 여러 곳에서 사용됩니다.
실크

1
이것은 내가해야 할 일에 완벽했습니다. 감사!
Christopher Smit

3

Laravel (5.6) 모델 클래스에서 저는 이것을 이렇게 불렀습니다. 두 메서드 모두 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")

static::클래스 이름 대신 내가 필요한 것입니다. 언급 해 주셔서 감사합니다.
Sincere
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.