Sortowanie tablic wielowymiarowych


(Marcin E Pc) #1

Witam!

Napisałem sobie przykładową tablicę trójwymiarową:

$produkt = array ( array(array('SAM_OPO', 'Opony', 100),

                         array('SAM_OLE', 'Olej', 10),

                         array('SAM_SWI', 'Świece zapłonowe', 4)

                        ),

                   array(array('VAN_OPO', 'Opony', 120),

                         array('VAN_OLE', 'Olej', 12),

                         array('VAN_SWI', 'Świece zapłonowe', 5)

                        ),

                   array(array('CIE_OPO', 'Opony', 150),

                         array('CIE_OLE', 'Olej', 15),

                         array('CIE_SWI', 'Świece zapłonowe', 6)

                        )

                 );

I chciałbym tą tablicę posortować powiedzmy wg. pola 1 tzn. Opis W książce był kod do sortowania tablic (a właściwie funkcja, jednak jestem na etapie tablic), i nie mogę go za nic zrozumieć. Funkcja ta wygląda tak:
[codefunction porownaj($x, $y) { if ($x[1] == $y[1]) return 0; elseif ($x[1] < $y[1]) return -1; else return 1; }
I teraz chcę to posortowane wyświetlić w tabeli więc :

echo '

| Kod | Opis | Cena |
| '. $produkt[$warstwa][$kolumna][0] .' | '. $produkt[$warstwa][$kolumna][1] .' | '. $produkt[$warstwa][$kolumna][2] .' |

';[/code] Ale jednak nic się nie zmienia, a ja nawet tego kodu nie mogę zrozumieć. Wiem tyle :
[code]<?phpfunction porownaj($x, $y) { if ($x[1] == $y[1]) //porównuje $x i $y czy są sobie równe (po co są te zmienne i co one oznaczają? return 0; // zwraca wartość funkcji, ale co to 0 oznacza, false? elseif ($x[1] < $y[1]) / jeżeli if nie jest spełniona sprawdza ten warunek return -1;//znów zwraca wartość funkcji? ale co oznacza -1? else //jeżeli żaden z powyższych warunków nie zostanie spełniony zwraca 1 -true? return 1;}?>

Pozdrowiena

Edit:

Działa na tablicach 2-wymiarowych, a jak zrobić żeby ruszyło na 3-wymiarowych? i jak ta funkcja działa oczywiście bo dalej nie wiem


(Maniooo666) #2

Witam,

Postaram się to wytłumaczyć na przykładzie zaczerpniętym z MSDN.

Oraz:

Ten opis powinien wszystko wyjaśnić.

Zwróć uwagę, że np. sortując po stringach należałoby użyć funkcji strcmp,

która zachowuje się podobnie, znaczy zwraca 0, gdy stringi równe, a wartości > lub < 1,

gdy wartości nie są takie same.

Czemu Ci funkcja nie działa, nie mam jeszcze pojęcia, jak mi coś do łba wpadnie, to dopiszę.

A może użyj tablic asocjacyjnych?

To jak dla mnie najfajniejsza sprawa w PHP.


(Marcin E Pc) #3

Tak, ale w takim razie jak posortować tablice trójwymiarowe lub inne wielowymiaorwe. I dalej nie rozumiem po co ten skrypt zwraca 1, 0 , 1 to chodzi o to true, false ??

A i co to sa za zmienne ( x i y ) argumenty funkcji? za co one w tablicy odpowiadają?


(Maniooo666) #4

Witam,

No zwraca +, 0 lub -, nad czym mędrkujesz?

Jeżeli zwraca wartość ujemną, to pierwszy (w danym momencie, nie w całej liście) element ma poprzedzić następny.

Jak jest odwrotnie, to ma być za nim.

Jak 0, to nic się nie zmienia.

Jaka filozofia?

Funkcja jest wywoływana tak długo, aż się wszystko nie posortuje.

Poczytaj jakieś podstawy programowania w czymkolwiek.

Przesyłasz cokolwiek, mogą to być inty, mogą być stringi, jak sobie funkcję odpowiednio zdefiniujesz, to i obiekty jakiejś klasy możesz przesyłać.

Poczytaj:

http://pl2.php.net/manual/pl/function.a ... tisort.php


(Marcin E Pc) #5

hmm.. trochę rozumiem ale trochę nie, czyli $x i $y to są 2 elementy tablicy czy jak (raczej to tak nie może być bo by to sortowało tylko 2 przykłady). Dla mnie to by mogła działać tak że $x pobiera element tablicy i porównuje go z elementami w $y ale przypuśćmy teraz sytuację:

mamy 3 elementy 2 już posortowane powiedzmy 2 i 5 są posortowane i pobiera z tablicy 1 więc jak więc jak porówna 2 i 5 z 1?


(Airborn) #6

zapis $x to poprostu zmienna x

zapis $x[2] to drugi element tablicy x (niewiem jak w php, w c++ byłby to trzeci element bo tam numeracja zaczyna się od 0)


(Marcin E Pc) #7

a skąd ty teraz wziąłeś to $x[2] ? (numeracja też się zaczyna od zera więc to będzie 3 :mrgreen: )

Ps. a array_multisort posortowało ale wg "Kod" (VAN_OPO - to jest kod) czyli wg pierwszego z lewej elementu każdej tablicy)