Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Sortowanie jak w MySQL
Forum PHP.pl > Forum > Przedszkole
KsaR
  1. $provinces=array(...);
  2. arsort($provinces);
  3. var_dump($provinces);
  4. krsort($provinces);
  5. var_dump($provinces);

Kod
array(16) { ["Warmińsko-Mazurskie"]=> string(1) "1" ["Kujawsko-Pomorskie"]=> string(1) "1" ["Śląskie"]=> string(1) "0" ["Pomorskie"]=> string(1) "0" ["Świętokrzyskie"]=> string(1) "0" ["Wielkopolskie"]=> string(1) "0" ["Zachodniopomorskie"]=> string(1) "0" ["Podlaskie"]=> string(1) "0" ["Opolskie"]=> string(1) "0" ["Lubuskie"]=> string(1) "0" ["Lubelskie"]=> string(1) "0" ["Łódzie"]=> string(1) "0" ["Małopolskie"]=> string(1) "0" ["Dolnośląskie"]=> string(1) "0" ["Mazowieckie"]=> string(1) "0" ["Podkarpackie"]=> string(1) "0" } array(16) { ["Świętokrzyskie"]=> string(1) "0" ["Śląskie"]=> string(1) "0" ["Łódzie"]=> string(1) "0" ["Zachodniopomorskie"]=> string(1) "0" ["Wielkopolskie"]=> string(1) "0" ["Warmińsko-Mazurskie"]=> string(1) "1" ["Pomorskie"]=> string(1) "0" ["Podlaskie"]=> string(1) "0" ["Podkarpackie"]=> string(1) "0" ["Opolskie"]=> string(1) "0" ["Małopolskie"]=> string(1) "0" ["Mazowieckie"]=> string(1) "0" ["Lubuskie"]=> string(1) "0" ["Lubelskie"]=> string(1) "0" ["Kujawsko-Pomorskie"]=> string(1) "1" ["Dolnośląskie"]=> string(1) "0" }


Jak widac pierwszy po pierwszym dumpie, posortowało wartosciami malejąco.
Drugi psuje wszystko.

Chce posortowac coś typu MySQL że zapamieta poprzednie sortowanie i przy kolejnym posortuje na tej samej tablicy ale nie od nowa...

W Mysql bym to zrobil: ORDER BY `values` DESC, `keys` DESC

Mam nadzieje że wyraziłem się jasno :|
Crozin
Te funkcje są od siebie kompletnie niezależne, także wynikiem całości będzie wyłącznie wynik działania krsort. Aby osiągnąć to o co pytasz możesz skorzystać z usort dla której utworzysz swoją własną funkcję porównującą.
KsaR
Cytat(Crozin @ 25.01.2015, 17:17:14 ) *
Te funkcje są od siebie kompletnie niezależne, także wynikiem całości będzie wyłącznie wynik działania krsort. Aby osiągnąć to o co pytasz możesz skorzystać z usort dla której utworzysz swoją własną funkcję porównującą.

  1. $provinces=array('Dolnośląskie'=>$top['p1'],'Kujawsko-Pomorskie'=>$top['p2'],'Lubelskie'=>$top['p3'],'Lubuskie'=>$top['p4'],'Łódzie'=>$top['p5'],'Małopolskie'=>$top['p6'],'Mazowieckie'=>$top['p7'],'Opolskie'=>$top['p8'],'Podkarpackie'=>$top['p9'],'Podlaskie'=>$top['p10'],'Pomorskie'=>$top['p11'],'Śląskie'=>$top['p12'],'Świętokrzyskie'=>$top['p13'],'Warmińsko-Mazurskie'=>$top['p14'],'Wielkopolskie'=>$top['p15'],'Zachodniopomorskie'=>$top['p16']);
  2. function arsortdesc($provinces)
  3. {
  4. $prov=(array)$provinces;//error: bez tego "string given" z tym "null given"
  5. arsort($prov);
  6. krsort($prov);
  7. return $prov;
  8. }
  9. usort($provinces, 'arsortdesc');

Nie ogarniam .., zwraca zle klucze-liczbowe (zaraz zedytuje - dalej testuje)

  1. function arsortdesc(array $provinces)
  2. {
  3. arsort($prov);
  4. krsort($prov);
  5. return (array)$prov;
  6. }

Teraz zwraca ze "Catchable fatal error: Argument 1 passed to arsortdesc() must be an array, string given in" (w lini z usort).
Nie potrafie tongue.gif
daniel1302
Ewidentnie nie przeczytałeś tego co podesłał Crozin
Funkcja usort przyjmuje dwa parametry:
bool usort ( array &$array , callable $value_compare_func )

Tablice oraz funkcje(nazwe funkcji zapisaną w "") która będzie porównywać nazweją
  1. callback
.

Funkcja callback, przyjmuje dwa parmaetry(Pierwszy lepszy przykład z manuala)

  1. function callback($a, $b)
  2. {
  3. if ($a == $b) {
  4. return 0;
  5. }
  6. return ($a < $b) ? -1 : 1;
  7. }


$a i $b to dwa elementy z tablicy. I jeśli a i b są równe to zwraca 0, jeśli a < b to zwraca -1 a jeśli przeciwnie to 1

I wystarczy, że dostosujesz funkcje do siebie. Następnym razem czyaj dokumentacje ze zrozumieniem jeśli nie potrafisz czytać po angielsku to dwa wyjścia meczyć się z translatorem albo uczyć języka.
KsaR
Cytat(daniel1302 @ 26.01.2015, 08:30:31 ) *
Ewidentnie nie przeczytałeś tego co podesłał Crozin
Funkcja usort przyjmuje dwa parametry:
bool usort ( array &$array , callable $value_compare_func )

Tablice oraz funkcje(nazwe funkcji zapisaną w "") która będzie porównywać nazweją
  1. callback
.

Funkcja callback, przyjmuje dwa parmaetry(Pierwszy lepszy przykład z manuala)

  1. function callback($a, $b)
  2. {
  3. if ($a == $b) {
  4. return 0;
  5. }
  6. return ($a < $b) ? -1 : 1;
  7. }


$a i $b to dwa elementy z tablicy. I jeśli a i b są równe to zwraca 0, jeśli a < b to zwraca -1 a jeśli przeciwnie to 1

I wystarczy, że dostosujesz funkcje do siebie. Następnym razem czyaj dokumentacje ze zrozumieniem jeśli nie potrafisz czytać po angielsku to dwa wyjścia meczyć się z translatorem albo uczyć języka.


Zauważ że wyżej próbowałem zrobić ten callback więc chyba przeczytałeś tylko post Crozin'a z uwagą.
" usort($provinces, 'arsortdesc'); " <i callback jest w cudzysłowie. Jednak dalej nie ogarniam tego co tam robić, poprostu nie na mój mózg opis tej funkcji. | znalezłem inne wyjscie gdzies na stackoverflow(troche przerobiłem nazwy zmiennych):

  1. function arrSort($arr)
  2. {
  3. $isKey=array();
  4. $isVal=array();
  5. foreach($arr as $key=>$value)
  6. {
  7. $isKey[]=$key;
  8. $isVal[]=$value;
  9. }
  10. array_multisort($isVal,SORT_DESC,$isKey,SORT_ASC,$arr);
  11. return $arr;
  12. }

niestety nie uwzględnia sortowania utf8 ale może być.
Crozin
ksort czy asort są tutaj bezużyteczne, ponieważ anulują one swoje wzajemne działanie. Musisz napisać własną funkcję, która weźmie pod uwagę wyłącznie Twoje dwa założenia:
  1. function($a, $b) {
  2. // najpierw sortujemy wg parametru VALUES
  3. if ($a['values'] > $b['values']) {
  4. return 1;
  5. } else if ($a['values'] < $b['values']) {
  6. return -1;
  7. }
  8.  
  9. // następnie - w przypadku, gdy te wartości są równe - sortujemy wg parametru KEYS
  10. if ($a['keys'] > $b['keys']) {
  11. return 1;
  12. } else if ($a['keys'] < $b['keys']) {
  13. return -1;
  14. }
  15.  
  16. // jeżeli obie wartości są takie same, nie zmieniamy kolejności
  17. return 0;
  18. }
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.