Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Sortowanie jak w MySQL
KsaR
post
Post #1





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

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


  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 :|
Go to the top of the page
+Quote Post
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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ą.
Go to the top of the page
+Quote Post
KsaR
post
Post #3





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

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


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 (IMG:style_emoticons/default/tongue.gif)

Ten post edytował Ksar 25.01.2015, 17:50:51
Go to the top of the page
+Quote Post
daniel1302
post
Post #4





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


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.

Ten post edytował daniel1302 26.01.2015, 08:32:29
Go to the top of the page
+Quote Post
KsaR
post
Post #5





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

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


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ć.
Go to the top of the page
+Quote Post
Crozin
post
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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. }
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: 24.08.2025 - 09:45