2011-05-11 3 views
5

다음과 같이 배열 정렬 기능이 있습니다.PHP에서 usort에 클로저를 전달할 수 있습니까?

public function sortAscending($accounts) 
{ 
    function ascending($accountA, $accountB) { 
     if ($accountA['AmountUntilNextTarget'] == $accountB['AmountUntilNextTarget']) { 
      return 0; 
     } 
     return ($accountA['AmountUntilNextTarget'] < $accountB['AmountUntilNextTarget']) ? -1 : 1; 
    } 
    usort($accounts, $ascending); 

    return $accounts; 
} 

검색 키를 하드 코딩하기 때문에 분명히 이상적이지 않습니다. 필자는 키를 외부 함수의 매개 변수로 전달함으로써이 일반 함수를 만들 것이라고 생각했지만 내부 함수에서는 범위를 벗어났습니다. 필자는 다음과 같이 내부 함수 대신 param에 액세스 할 수있는 클로저를 사용하여이 문제를 해결하려고했습니다.

public function sortAscending($accounts, $key) 
{ 
    $ascending = function($accountA, $accountB) { 
     if ($accountsA[$key] == $accountB[$key]) { 
      return 0; 
     } 
     return ($accountA[$key] < $accountB[$key]) ? -1 : 1; 
    } 
    usort($accounts, $ascending); 

    return $accounts; 
} 

그러나 usort()는 함수 이름 만 허용하므로 작동하지 않습니다. . 누구든지이 달성의 (더 나은?) 방법을 볼 수 있습니까?

+3

는'usort'은 폐쇄 될 수있는'callback' 매개 변수를 받아들입니다. 코드에서 명백한 오류는 함수 정의 뒤에';'가 누락 된 것입니다. 어쩌면 그것이 오류의 원인 일 수 있습니다. – lonesomeday

+2

누락 된';'외에도'$ key'도 클로저의 범위에 있지 않습니다. 당신은 그것을 사용해야한다 :'$ ascending = function ($ acciontA, $ accountB) use ($ key) {..'. – alexn

답변

12

클로저는 상위 영역의 변수 물려있다. 이러한 변수는 함수 헤더에서 선언해야합니다. 부모 범위에서 변수 을 상속하는 것은 전역 변수를 사용하는 것과 같지 않습니다. 글로벌 변수는 글로벌 범위에 존재하며 함수가 실행 중인지 상관없이 동일합니다. 입니다. 클로저 범위는 에서 클로저가 선언 된 함수입니다 ( 이 아님). 에서 함수가 필요합니다.

  • 도 폐쇄를 정의하고 변수에 할당하는 정상 할당 작업입니다 있습니다, 그래서 당신은 폐쇄의 폐쇄 };가 필요합니다. 이러한 코드는 다음과 같이 보일 것이다 (그리고 잘 작동합니다) 변경하고 후

:

public function sortAscending($accounts, $key) 
{ 
    $ascending = function($accountA, $accountB) use ($key) { 
     if ($accountsA[$key] == $accountB[$key]) { 
      return 0; 
     } 
     return ($accountA[$key] < $accountB[$key]) ? -1 : 1; 
    }; 
    usort($accounts, $ascending); 

    return $accounts; 
} 
+0

답장을 보내 주신 bazmegakapa와 다른 분들께 감사드립니다. 정말 도움이됩니다. 누락 된 세미 콜론 죄송합니다. 학교 소년 오류입니다. – igniteflow

관련 문제