2011-05-11 10 views
5

Mam tablicę funkcji sortowania następująco:Możliwe jest przekazanie zamknięcia do usortowania w PHP?

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; 
} 

Oczywiście to nie jest idealne, ponieważ trudno jest kodowanie klucza do wyszukania. Myślałem, że zrobię ten rodzajnik, przekazując klucz jako parametr do funkcji zewnętrznej, ale jest to poza zakresem w funkcji wewnętrznej. Próbowałem to obejść za pomocą zamknięcia, które będzie miało dostęp do param, zamiast wewnętrznej funkcji w następujący sposób:

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; 
} 

Jednak usort() przyjmuje tylko nazwy funkcji, tak to nie działa . Czy ktokolwiek może zobaczyć (lepszy?) Sposób osiągnięcia tego?

+3

'' usort' akceptuje parametr callback', który może być zamknięcie. Oczywistym błędem w twoim kodzie jest brakujące ';' po definicji funkcji. Może to jest przyczyną błędu. – lonesomeday

+2

Oprócz brakującego ';', '$ key' również nie znajduje się w zasięgu twojego zamknięcia. Powinieneś go użyć: '$ rosnąco = funkcja ($ acciontA, $ accountB) use ($ key) {..'. – alexn

Odpowiedz

12

Zamknięcia mogą również dziedziczyć zmienne z zakresu nadrzędnego. Wszelkie takie zmienne muszą być zadeklarowane w nagłówku funkcji . Dziedziczenie zmiennych z zakresu nadrzędnego nie jest tym samym jak używanie zmiennych globalnych. Zmienne globalne istnieją w zakresie globalnym, , który jest taki sam, bez względu na to, jaka jest wykonywana funkcja . Macierzysty zakres zamknięcia jest funkcją w , której zamknięcie zostało zadeklarowane (nie jest to funkcja, którą nazwano ).

  • Należy również pamiętać, że definiowanie zamknięcie i przypisanie go do zmiennej jest normalna praca przydział, więc trzeba będzie się ; po zamknięciu } zamknięcia.

Po dokonaniu tych zmian Twój kod będzie wyglądać następująco (i powinny działać prawidłowo):

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

Dzięki Bazmegakapa i innym osobom za szybką odpowiedź, jest to naprawdę pomocne. Przeprosiny za brakujący półkolonii, którego nie zauważyłem, błąd chłopca. – igniteflow

Powiązane problemy