Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Funkcja uasort()
marcinek37
post
Post #1





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

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


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
Daimos
post
Post #2





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


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 (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
marcinek37
post
Post #3





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

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


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
Go to the top of the page
+Quote Post
Daimos
post
Post #4





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


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
Go to the top of the page
+Quote Post
marcinek37
post
Post #5





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

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


Możesz pokazać przykład? Czy użyłeś kiedyś tej funkcji do czegoś, co naprawdę Ci się przydało?
Go to the top of the page
+Quote Post
kreatiff
post
Post #6





Grupa: Zarejestrowani
Postów: 324
Pomógł: 105
Dołączył: 7.08.2012

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


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']; });
Go to the top of the page
+Quote Post
marcinek37
post
Post #7





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

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


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
Go to the top of the page
+Quote Post
kreatiff
post
Post #8





Grupa: Zarejestrowani
Postów: 324
Pomógł: 105
Dołączył: 7.08.2012

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


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.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 3.10.2025 - 01:51