Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Problem z usort
Forum PHP.pl > Forum > Przedszkole
andrzej7322
Wiatm mam problem ze zrozumieniem dzialania funkcji usort na tablicach wielowymiarowych.
Nie potrafie zrozumiec zasady wprowadzania zmiennych używanych w funckji ktorą wywoluje usort.
  1. function cmp($a, $b)
  2. {
  3. if ($a == $b) {
  4. return 0;
  5. }
  6. return ($a < $b) ? -1 : 1;
  7. }
  8.  
  9. $a = array(3, 2, 5, 6, 1);
  10.  
  11. usort($a, "cmp");

na powyższym przykładzie mamy w cmp() uzyte zmienne $a oraz $b.Gdzie je inicjujemy ?
Po wielu probach zrozumienia funkcji doszedłem do tego że te zmienne pobierane są z tablicy którą chcemy posortować.Proszę o pomoc w zrozumieniu zasady inicjacji tych zmiennych.
waqmaz
Z tego co wiem to usort chyba nie istnije. Są sort, ksort i i asort, ale nie jestem pewien.

sort sortuje rosnąco alfabetycznie

  1. $cmp = array( 'mama' , 'babcia' , 'tata');
  2. sort($cmp);


lub

  1. $liczby = array( 100, 200, 4);
  2. sort($liczby);


asort sortuje wg elementow wartosci np.

  1. $cmp = array( 'mama'=> 100, 'babcia'=>20, 'tata'=>30);
  2. asort($cmp);


ksort sortuje alfabetycznie:

  1. $cmp = array( 'mama'=> 100, 'babcia'=>20, 'tata'=>30);
  2. ksort($cmp);


edit: jdnak istnieje funkcja usort zara ci powiem bo juz nie pamietam jak to bylo:
a więc:

  1. $a = array(array('M', 'Mama', 100),
  2. array('S', Samochod', 2),
  3. array('D', 'Dom', 3 ) ) ;
  4.  
  5. function cmp($a, $b)
  6. {
  7. if ($a[1] == $b[1]){
  8. return 0;
  9. }
  10. else
  11. if ($a[1] < $b[1]){
  12. return -1;
  13. }
  14. else{
  15. return 1;
  16. }
  17. }
  18.  
  19. usort('cmp', $a);


Powiem ci szczerze, ze anomalią jest aby ktoś na świecie zrozumiał tą funkcję tzn. mało jets programistów ją rozumiejących, dlatego posługuj się gotowymi przykładami.
andrzej7322
Pomoze ktoś bo powyższy post nie pomógł mi wogóle.
singles
Cytat(andrzej7322 @ 29.01.2011, 15:39:40 ) *
na powyższym przykładzie mamy w cmp() uzyte zmienne $a oraz $b.Gdzie je inicjujemy ?

Nigdzie ich nie inicjujesz. Są one przekazywane automatycznie do funkcji zwrotnej (tzw. callback) w kodzie funkcji usort.

Hmm, spróbuje to pokazać na przykładzie przykładowej funkcji która wykorzystuje callback:
  1. function concatReverse($a, $b)
  2. {
  3. return $b . $a;
  4. }
  5.  
  6. function myFunctionWithCallback($callbackName)
  7. {
  8. $first = 'Foo';
  9. $second = 'Bar';
  10. return $callbackName($first, $second);
  11. }
  12.  
  13. echo myFunctionWithCallbackUser('concatReverse');

Najpierw definiuję funkcję, której użyję jako callbacka, a później funkcję, która z niego skorzysta. Do funkcji myFunctionWithCallback przekazuję nazwę funkcji którą chcę odpalić. Jak widzisz, w ramach funkcji myFunctionWithCallback to ja decyduję w jakiej kolejności przekazać parametry - mogą one pochodzić ze zmiennych jak w tym wypadku (first, second), albo być przekazane normalnie:
  1. return $callbackName('Foo', 'Bar');

O to chodzi, że callbacka, tak jak normalnej funkcji (którą to callback jest!) nie interesuje skąd się wzięły parametry - to Twoim zdaniem jest je do niej przekazać.
W przypadku usort zrobili to za Ciebie twórcy PHP.

Callbacki są bardzo często spotykane w języku JavaScript, tak więc tam możesz szukać zasady działania.

BTW. Od PHP 5.3 można przekazywać funkcje jako parametry, dzięki wprowadzeniu funkcji anonimowych - wtedy kod usort który podałeś mógłby wyglądać tak:
  1. $a = array(3, 2, 5, 6, 1);
  2.  
  3. usort($a, function ($a, $b) {
  4. if ($a == $b) {
  5. return 0;
  6. }
  7. return ($a < $b) ? -1 : 1;
  8. });
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.