Sortowanie tablic z uwzględnieniem specyficznych potrzeb aplikacji – sortowanie hierarchiczne

Założenie: Posortujemy listę kategorii produktów, które mają strukturę drzewiastą (kategorie podrzędne). Chcemy uzyskać posortowaną listę, zachowując relacje hierarchiczne między kategoriami.

Krok po kroku:

  1. Przygotowanie danych: Zdefiniujmy tablicę asocjacyjną reprezentującą kategorie produktów. Każda kategoria będzie miała identyfikator, nazwę i identyfikator rodzica (0 dla kategorii głównych).
  2. 
    $kategorie = [
        ['id' => 1, 'nazwa' => 'Elektronika', 'rodzic' => 0],
        ['id' => 2, 'nazwa' => 'Komputery', 'rodzic' => 1],
        ['id' => 3, 'nazwa' => 'Laptopy', 'rodzic' => 2],
        ['id' => 4, 'nazwa' => 'Telefony', 'rodzic' => 1],
        ['id' => 5, 'nazwa' => 'RTV', 'rodzic' => 0],
        ['id' => 6, 'nazwa' => 'Telewizory', 'rodzic' => 5],
        ['id' => 7, 'nazwa' => 'Sprzęt audio', 'rodzic' => 5],
    ];
    				
  3. Funkcja sortowania: Napiszemy funkcję, która posortuje tablicę, uwzględniając relacje rodzic-dziecko. Użyjemy funkcji `usort` z własną funkcją porównującą.
  4. 
    function sortujKategorie($a, $b) {
        if ($a['rodzic'] == $b['rodzic']) {
            return strcmp($a['nazwa'], $b['nazwa']); // Sortuj alfabetycznie, jeśli ten sam rodzic
        }
        return $a['rodzic'] - $b['rodzic']; // Sortuj po id rodzica
    }
    
    usort($kategorie, 'sortujKategorie');
    				
  5. Wyświetlenie wyników: Wyświetlimy posortowaną tablicę.
  6. 
    foreach ($kategorie as $kategoria) {
        echo $kategoria['nazwa'] . "
    "; }

Powyższy kod posortuje tablicę $kategorie najpierw po identyfikatorze rodzica, a następnie alfabetycznie dla kategorii o tym samym rodzicu.

Ten przykład pokazuje podstawy sortowania tablic w PHP z uwzględnieniem specyficznych warunków. Zachęcamy do eksperymentowania z różnymi funkcjami sortowania i warunkami porównywania, aby dostosować je do własnych potrzeb.

Dodaj komentarz 0

Your email address will not be published. Required fields are marked *