[php] algorytm kategorii

0

Czesc.
Sluchajcie mam duzy problem. Wiecie jak wyglada panel admina w phpbb2 w module for? Chce zrobic cos takeigo u siebie. Mianowicie:
moja tablea sql wyglada tak:

+--+----------+----+
|id|parent_cat|name|
+--+----------+----+

i chce to wszystko ladnie wyswielic np:

motoryzacja
 |- samochody
   |- ford
   |- mazda
     |- nowe 
     |- stare
 |- motory
 |- silniki
komputery
 |-notebooki
 | pc
filmy

POmoze mi ktos wymylic algorytm tak porzadkujac to wszsytko? :P tabel kategorii jest bardzo podobna w phpbb2
dzieki :)

0

dobra, ale ty masz tylko id i parent_cat. to troche malo. zauwaz, ze:

1,0,motoryzacja
2,1,samochody
3,2,ford
4,2,mazda
[...]

moze wygldac:

1,0,motoryzacja
2,1,samochody
4,2,mazda
3,2,ford

[...]

znaczy sie, brakuje ci czegos w bazie sluzacego do opisu polozenia poszczegolnych for. tylko jedno pole jest potrzebne. bedziesz w nim zapisywal pozycje, zakladajac np, ze im mniejsza wartosc tego pola, to fora beda wyzej. dajmy taki przyklad:

1,0,1,owoce
2,1,4,afrykanskie
3,1,1,europejskie
4,0,2,warzywa
5,4,2,europejskie
6,4,3,afrykanskie

i takie cos mozna zapisac tylo w taki sposob:

1,0,1,owoce
3,1,1,europejskie
2,1,4,afrykanskie
4,0,2,warzywa
5,4,2,europejskie
6,4,3,afrykanskie

mam nadzieje, ze zostalem zrozumiany :)

0

no przydałaby się trzecia wartość bo bez niej zmienić kolejność = przeprawianie wszystkich indexów

no ale przykład takiego czegoś (nie przetestowałem dobrze jeszcze):

<?php

$tablica = Array(
  0 => Array() // zarezerwowane dla roota
);

while($row = mysql_fetch_assoc($q)){
  if(!isset($row[ 'order' ]))
    $row[ 'order' ] = 0;
  $tablica[] = $row; // min kolumny: id, parentId, name
}


// przygotowanie tablicy

$sortAlpha = false;
  // pozycje o tym samym order mają być posortowane: false = w/g id; true = alfabetycznie

foreach($tablica as $id => $dane){
  $item = & $tablica[ $id ];

  $item[ 'childsOrder' ]  =
    $item[ 'additOrder' ] =
    $item[ 'childs' ]     = Array();

  if($id){
    $parent = & $tablica[ $dane[ 'parentId' ] ];

    $parent[ 'childs' ]      [] = & $item;
    $parent[ 'childsOrder' ] [] = $item[ 'order' ];
    $parent[ 'additOrder' ]  [] = $sortAlpha ? $item[ 'name' ] : $item[ 'id' ];
  }
}




// wyświetlenie tablicy

function pokazTo($noAleCo, $additOrderType = SORT_NUMERIC){
  if(isset($noAleCo[ 'name' ]))
    echo $noAleCo[ 'name' ];

  echo '<ul>';
  array_multisort($noAleCo[ 'childsOrder' ], SORT_ASC,
     $noAleCo[ 'additOrder' ], $additOrderType, SORT_ASC,
     $noAleCo[ 'childs' ]);

  foreach($noAleCo[ 'childs' ] as $child){
    echo '<li>';
    pokazTo($child, $additOrderType);
    echo '</li>';
  }
  echo '</ul>';
}

if(isset($tablica[0][ 'childs' ]))
  pokazTo($tablica[0], $sortAlpha ? SORT_REGULAR : SORT_NUMERIC);

?>
0

Bardzo stary moj projekt i wiecej go nie rozszerzalem i nie udoskonalalem. Ale moze sie przyda kod:

http://inteco.win.pl/menu/menu.php

0

Jak dla mnie to wszystko da sie z tymi kolumnami jakie zamiescilem, id, name i parent_cat. To pewnie bedzie jakas funkcja rekurencyjna. Choc order tez mam ale to ma inne znaczenie. BO kolejnosc bedzie zawsze ta smaa gdy posortujemy alfabetycznie. Ale cos jeszcze poszukam i przeanalizuje wasze kod, choc ten ostatni to tak raczej prymitywny mi sie wydaje ten pomysl, ale moze sie przydac, dzieki :D

po drugie to nie forum, to ma byc zwykle menu ;p

0

no to moja funkcja:
a) jest rekurencyjna,
b) jeżeli nie będzie kolumny order i $sortAlpha ustawisz na true to posortuje alfabetycznie

1 użytkowników online, w tym zalogowanych: 0, gości: 1