Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Funkcja uasort()
Forum PHP.pl > Forum > Przedszkole
marcinek37
Mam kod z manuala:
  1. <?php
  2. // Comparison function
  3. function cmp($a, $b) {
  4. if ($a == $b) {
  5. return 0;
  6. }
  7. return ($a < $b) ? -1 : 1;
  8. }
  9.  
  10. // Array to be sorted
  11. $array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);
  12. print_r($array);
  13.  
  14. // Sort and print the resulting array
  15. uasort($array, 'cmp');
  16. print_r($array);
  17. ?>


Nie rozumiem, na czym polega funkcja "cmp".
Umieszcza się do niej dwie informacje, tj. $a i $b.

Jeśli $a to nazwy typu "a", "b" itd., a $b to 4, 1 itp. to skąd w kodzie jest coś takiego "$a == $b" - przecież literka nigdy nie będzie równa liczbie.
Czy ktoś może mi pokazać jakiś prosty przykład?
Daimos
Niech ktoś mnie poprawi, jeśli palnę głupotę, ale wydaje mi się, że przy tym sortowaniu występuje algorytm przez wstawianie (tak się nazywa? Myślałem, że przez porównywanie wink.gif ). Masz tutaj przykład:
http://edu.i-lo.tarnow.pl/inf/alg/003_sort/0010.php
Co do callbacka, analogicznie jak tam opisali, porównujesz kolejno ze sobą elementy i sortujesz. $a i $b - co możesz sobie wyświetlić, to są dwie wartości z tablicy (nie klucze), dlatego też, nie ma porównań typu a < 1, ponieważ to jest przykład do sortowania tablicy z wartościami liczbowymi. Dodaj echo do każdej zmiennej i trochę Ci się rozjaśni
marcinek37
Twój link wiele wyjaśnił, ale zastanawiam się, w jaki sposób można to wykorzystać?
Bo w sumie funkcja ta tylko posortowała wyniki od najmniejszej do największej wartości, co można uzyskać w prostszy sposób
Daimos
zwracając odpowiedni wynik w Twojej funkcji, możesz stworzyć dowolne sortowanie, np. najpierw parzyste, później nie, albo najpierw wyrazy 3 literowe, później dwu itd itd. Nie musisz porównywać tutaj cyfr, możesz zrobić tutaj funkcje dla tekstu
marcinek37
Możesz pokazać przykład? Czy użyłeś kiedyś tej funkcji do czegoś, co naprawdę Ci się przydało?
kreatiff
usort świetnie nadaje się do sortowania tablic wielowymiarowych po jakiejś wartości z podtalicy.
Ja np. używałem usort ostatnio przy sortowaniu takiej tablicy:
  1. $baza = array(
  2. 'x' => ...
  3. 'y' => ...
  4. 'reputation' = array(
  5. 1 => array(
  6. 'datetime' => 1234567,
  7. ...
  8. )
  9. 2 => array(
  10. 'datetime' => 10,
  11. ...
  12. )
  13. 3 => array(
  14. 'datetime' => 10000,
  15. ...
  16. )
  17. )
  18. 'z' => ...
  19. )
  20. usort($baza['reputation'], function($a, $b) { return $a['dateline'] - $b['dateline']; });
marcinek37
i właśnie nie rozumiem, co Ci w tym kodzie dało "$a['dateline'] - $b['dateline']"
bardzo proszę o jakiś ludzki przykład, oparty na jakimś życiowym doświadczeniu
kreatiff
Każde sortowanie polega na przyrównywaniu kolejnych elementów ze sobą i ustalanie ich pozycji w szeregu.
I do tego właśnie wykorzystuje się sortowanie szybkie dla kolejnych elementów sortowanej tablicy.

Funkcje sort itd. robią dokładnie to samo, tylko mają z góry zaprogramowane metody sortowania, że od największej do najmniejszej, że alfabetycznie, naturalnie, itp.

usort idzie dalej. Pozwala posortować coś, czego standardowe algorytmy sortowania PHP nam nie umożliwiają.
Wszystko co trzeba zrobić, to napisać małą funkcję, która dowolne dwa elementy porówna i zwróci wartość 0 (elementy są takie same), ujemną (pierwszy element będzie przed drugim, czyli jest "mniejszy") lub dodatnią (pierwszy będzie za drugim, czyli jest większy).

Jak w życiu natrafisz na problem posortowania czegoś, co nie będzie podchodziło pod żadną z gotowych funkcji sortowania, to z pomocą przyjdzie usort. Mój przykłąd użycia powyżej. Było tego więcej, ale teraz nie pamiętam już dokładnie.
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.