Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Problem z usort
andrzej7322
post
Post #1





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 8.05.2010

Ostrzeżenie: (20%)
X----


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.

Ten post edytował andrzej7322 29.01.2011, 15:42:25
Go to the top of the page
+Quote Post
waqmaz
post
Post #2





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 22.01.2011
Skąd: Murowana Goślina

Ostrzeżenie: (0%)
-----


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.

Ten post edytował waqmaz 29.01.2011, 16:20:39
Go to the top of the page
+Quote Post
andrzej7322
post
Post #3





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 8.05.2010

Ostrzeżenie: (20%)
X----


Pomoze ktoś bo powyższy post nie pomógł mi wogóle.
Go to the top of the page
+Quote Post
singles
post
Post #4





Grupa: Zarejestrowani
Postów: 121
Pomógł: 26
Dołączył: 2.07.2007

Ostrzeżenie: (0%)
-----


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


Ten post edytował singles 29.01.2011, 19:02:44


--------------------
Works for me => u mnie działa - blog o (o)programowaniu i nie tylko
meet.php - darmowe meetupy związane z PHP
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 01:51