Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: inne sortowanie
Forum PHP.pl > Forum > PHP
grzece
Jak zrobic zeby zeby w asort() indexy ktore nic nie mają byly na samym koncu a nie na poczatku.
plewa
krsort()" title="Zobacz w manualu PHP" target="_manual
Porządkuje tablicę względem kluczy w odwrotnej kolejności.
dr_bonzo
Jemu chodzilo chyba o cos innego:
chcial uzyskac sortowanie alfabetyczne z tym zeby puste wartosci szly na koniec a nie na poczatek.
Musisz uzyc usort() i utworzyc swoja funkcje porownujaca (uzyj m.in. strcmp()) i nakazac jej uznawanie pustych wartosci za "wieksze" od dowolnych niepustych.
grzece
Nie za bardzo wiem jak taka funkcje zrobic bo w manualu jest jakis dziwny ten przyklad.
Fipaj
Zastosowanie funkcji krsort():
  1. <?php
  2.  
  3. $tablica = array(1, 2, 3, 4);
  4. krsort($tablica);
  5. // tablica wygląda tak: 4, 3, 2, 1
  6.  
  7. ?>
grzece
Po pierwsze to krsort sortuje wedlug kluczy a nie wartosci.
A po drugie to ja chce normalne sortowanie a nie odwrotne tylko zeby "nic" bylo na koncu. Bo rsort posortuje taka tablice:
  1. <?
  2. $tab = array(&#092;"a\", \"b\", \"c\", \"d\", \"\");
  3. rsort($tab);
  4. print_r ($tab);
  5. ?>

Wychodzi tak
Array ( [0] => d [1] => c [2] => b [3] => a [4] => )
A ja chce tak:
Array ( [0] => a [1] => b [2] => c [3] => d [4] => )
plewa
  1. <?php
  2.  
  3. $tablica = array (&#092;"1\"=>\"b\", \"2\"=>\"j\", \"3\"=>\"a\", \"4\"=>\"\");
  4.  
  5. function porownaj()
  6. {
  7. if (strlen($tablica)<0) {
  8. //jeszce jakas instrukcja }
  9. }
  10.  
  11. usort($tablica, 'porownaj');
  12. print_r($tablica);
  13.  
  14. ?>

Kod
nic innego nie przychodzi mi do głowy. Jeśli może być niealfabetycznie możesz użyć funkcji rsort();
.
dr_bonzo
Pisalem o czyms takim:
  1. <pre>
  2. <?php
  3. $tab = array( &#092;"a\", \"b\", \"c\", \"d\", \"\" );
  4. usort( $tab, 'compare' );
  5.  
  6. function compare( $a, $b )
  7. {
  8. // element $a jest pusty lub ($a i $b sa puste -- wtedy ich kolejnosc nie ma znaczenia)
  9. if ( strlen( strval( $a ) ) === 0 )
  10. {
  11. return 1;
  12. }
  13.  
  14. // element $b jest pusty
  15. if ( strlen( strval( $b ) ) === 0 )
  16. {
  17. return -1;
  18. }
  19.  
  20. // dla pozostalych przypadkow
  21. return strcmp( strval( $a ), strval( $b ) );
  22. }
  23.  
  24. print_r( $tab );
  25. ?>
  26. </pre>
-- dziala
grzece
No rzeczywiscie dziala.
Ale nie do konca. Mam taki array:
  1. <?
  2. $tab = array(&#092;"5\", \"4\", \"16\");
  3. usort($tab, 'compare');
  4. print_r ($tab):
  5. ?>

Wychodzi takie cos:
Array ( [0] => 16 [1] => 4 [2] => 5 )
A powinno
Array ( [0] => 4 [1] => 5 [2] => 16 )
dr_bonzo
Czyli dziala tak jak powinno dzialac, a dlaczego? bo chciales porownywac TEKST (stringi) i w takim przypadku "16" jest "mniejsze" niz "4" -- co innego dla liczb: 16 > 4.
grzece
A to czemu 4 jest "mniejsze" niz 5?
dr_bonzo
No bo porownuje je jako tekst, w sposob zblizony do alfabetycznego (tzn wykorzystuje chyba kody ASCII znakow): porownuje po kolei znaki tekstu
"16" i "4"
"1" < "4" wiec "16" < "4"

"4" i "5"
"4" < "5"

"46" i "45"
"4" == "4", "6" > "5" czyli "46" > "45",
jasne?
slash^
a ja bym zamienił "puste" komórki tabeli na jakis ciąg znaków typu "ZZZZZXY%&; " funkcjami foreach i if
a po posortowaniu przez rsort zrobił funkcje odwrotną, czyli odmienił mój szyfr na puste ciągi...

smile.gif
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.