Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie tablicy wg własnego wzoru
Forum PHP.pl > Forum > PHP
netvalue
Witam

  1.  
  2. array(1) { ["myarr"]=> array(5) {
  3. [0]=> array(5) { ["symbol"]=> string(6) "EUR" ["desc"]=> string(6) "da" }
  4. [1]=> array(5) { ["symbol"]=> string(6) "USD" ["desc"]=> string(6) "adad" }
  5. [2]=> array(5) { ["symbol"]=> string(6) "CHF" ["desc"]=> string(6) "das23" }
  6. [3]=> array(5) { ["symbol"]=> string(6) "GBP" ["desc"]=> string(6) "dd12" }
  7. [4]=> array(5) { ["symbol"]=> string(6) "NOR" ["desc"]=> string(6) "233" }
  8. }
  9. }
  10.  


potrzebuje posortować ja symbol ale w kolejności takiej:
NOR, USD, EUR, CHF , GBP

Próbowałem z usort ale w tym przypadku chyba sie nie przyda...
freemp3
usort jak najbardziej sie przyda. W funkcji porównującej wystarczy stworzyć tablicę, gdzie kluczami będą skróty walut, a wartościami wagi ważności, np dla NOR będzie 1, a dla EUR będzie 3. Możesz porówywać wagi i na podstawie wyniku zwracać wartość.
buliq
dlaczego się nie przyda?
sowiq
Zawsze możesz swoją tablicę przekonwertować do takiego formatu:
  1. array(1) {
  2. ["myarr"]=> array(5) {
  3. ["EUR"]=> array(5) { ["symbol"]=> string(6) "EUR" ["desc"]=> string(6) "da" }
  4. ["USD"]=> array(5) { ["symbol"]=> string(6) "USD" ["desc"]=> string(6) "adad" }
  5. ["CHF"]=> array(5) { ["symbol"]=> string(6) "CHF" ["desc"]=> string(6) "das23" }
  6. ["GBP"]=> array(5) { ["symbol"]=> string(6) "GBP" ["desc"]=> string(6) "dd12" }
  7. ["NOR"]=> array(5) { ["symbol"]=> string(6) "NOR" ["desc"]=> string(6) "233" }
  8. }
  9. }


A później już chyba wiadomo jak to wydrukować (bo zakładam, że o to chodzi). Takie rozwiązanie będzie ciut bardziej optymalne niż sortowanie i łatwiejsze w implementacji.

Ale tak jak zostało napisane wcześniej - usort zrobi robotę.
netvalue
zrobiłem wiec funkcje do uasort($myarr , 'sort_myarr')

  1.  
  2. function sort_myarr($a, $b) {
  3.  
  4. static $sizes = array( 'NOR' => 0, 'USD' => 1, 'EUR' => 2, 'CHF' => 3, 'GBP' => 4);
  5.  
  6.  
  7. return $sizes[$a] - $sizes[$b];
  8. }


ale niestety nie sortuje
freemp3
Na pewno nie zadziała. W zmiennej a oraz b są elementy tablicy, a w Twoim przypadku są to tablice. Instrukcja:
  1. $sizes[$a]

rzutuje tablice w zmiennej a na string czego rezultatem będzie
  1. $sizes['Array']

Po drugie, odejmowanie także nie ma prawa zadziałać. Funkcja ma zwrócić 1 jeśli a jest większe od b, -1 jeśli b jest większe od a lub 0 jeśli a i b są równe.

Aby to rozwiązać należy z zmiennych a i b wczytać wartość kluczy symbol i następnie przy pomocy if-ów porównać wagi tych wartości i zwrócić odpowiednią wartość.
sowiq
Cytat(freemp3 @ 6.08.2013, 11:27:11 ) *
Po drugie, odejmowanie także nie ma prawa zadziałać. Funkcja ma zwrócić 1 jeśli a jest większe od b, -1 jeśli b jest większe od a lub 0 jeśli a i b są równe.

Kolego, gwoli ścisłości, nie masz racji. Wartości zwracane to nie "-1", "0", "1", tylko "mniej niż zero", "0", "więcej niż zero". Więc równie dobrze zamiast -1 możesz zwracać -2, -999 czy -312. Ale -0.9 już nie.

Cytat
The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.


Cytat
Caution Returning non-integer values from the comparison function, such as float, will result in an internal cast to integer of the callback's return value. So values such as 0.99 and 0.1 will both be cast to an integer value of 0, which will compare such values as equal.


freemp3
Fakt, przepraszam, za wprowadznie w błąd.
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.