Autor | Zpráva | ||
---|---|---|---|
H13 Profil * |
#1 · Zasláno: 15. 2. 2006, 16:10:05
Ahoj potřeboval bych poradit s funkcí PHP. Jak vytvořit smyčku abych nemusel pořád vytvářet podsmyčky.
Příklad: Výpis Kategorii a jejich podkategorii. Kořen = 0 v kořenu jsou nějaké kategorie a v těch kategoriích jsou další "podkategorie" a v těch dalších "podkategoriích" jsou "další "podpodkategorie" např.: Kategorie1 - Kategorie 2 - Kategorie3 ____________________ - Kategorie4 ____________________ - Kategorie5 _________- Kategorie6 - Kategorie7 _________- Kategorie8 - Kategorie9 - Kategorie10 _________- Kategorie11(patří pod kategorii č.1) Jestliže existuje omezený počet úrovní(1. úroveň=Kategorie, 2. úroveň=Podkategorie, 3. úroveň=Podpodkategorie", třeba 2, pak lze postupovat postupně a každou podúroveň vložit do úrovně nad ní. např.: $query1 = "SELECT IDKategorie, JmenoKategorie FROM Kategorie WHERE NadrazenaKategorie=0"; $result1 = mysql_query($query1); $pocetkategorii = mysql_num_rows($result1); for($k=0;$k<$pocetpodkategorii;$k++) { $cislokategorie =mysql_result($result1,$k,"IDKategorie"); $jmenokategorie =mysql_result($result1,$k,"JmenoKategorie"); echo $jmenokategorie . "<br />"; $query2 = "SELECT IDKategorie, JmenoKategorie FROM Kategorie WHERE NadrazenaKategorie=$cislokategorie"; $result2 = mysql_query($query2); $pocetpodkategorii = mysql_num_rows($result2); for($l=0;$l<$pocetpodkategorii;$l++) { $cislopodkategorie =mysql_result($result2,$l,"IDKategorie"); $jmenopodkategorie =mysql_result($result2,$l,"JmenoKategorie"); echo $jmenokategorie . " - " . $jmenopodkategorie . "<br />"; } } Jak ale vytvořit funkci (nejsem programátor ale myslím že ji nazývají rekurzivní funkce - diskuze MySQL na stejné téma -Kajman_), jestliže neznám celkový počet úrovní nebo lépe řečeno: počet úrovní je znám, ale tento počet se může zvyšovat a proto je potřeba místo statické funkce (výše uvedená platí pro dvě úrovně), použít funkci, která se přizpůsobí Díky moc....Honza |
||
H13 Profil * |
#2 · Zasláno: 15. 2. 2006, 16:15:02
Ještě jsem zapoměl. V databázi jsou uloženy údaje o kategoriích takto:
JménoKategorie, ČísloKategorie, ČísloNadřazenéKategorie to znamená, že kategorie, které nemají žádné nadřazené kategorie, jsou podřízené přímo kořenu Kořen = 0 0 --> Kategorie č.1 0 --> Kategorie č.2 --> Kategorie č.3 0 --> Kategorie č.4 Kategorie č.1 leží přímo v kořenu, Kat. č3 má nadřazenou kategorii č.2 a ta leží přímo v kořenu 0, atd |
||
mila Profil |
#3 · Zasláno: 15. 2. 2006, 16:31:12
Tohle je v MySQL trochu problém, říká se tomu tranzitivní uzávěr.
Není problém napsat rekurzivní fci, ale může se ti stát, že počet dotazů na databázi bude obrovský. Vlastně pro každou kategorii jeden, když si vezmeš že jich mohou být tisíce, tak to prostě nejde. Pak by to chtělo hledat jiné řešení. Ta funkce bude vypadat asi takto:
Netestoval jsem to, ale měl by si dát fci id hlavní kategorie. Ono to najde všechny podkategorie. Postupně je to ukládá do pole (indexovaného pomocí id kategorie). Takže první rozměr jsou řádky, druhý sloupce. Krom sloupců je tam ale další hodnota, kterou získá tak, že pustí sám sebe, jen s novým id. Takže vznikne vlastně strom. Pokud mají hlavní kategorie patri = 0, tak to pustíš s nulou. Jinak to chce ještě ošetřit. |
||
H13 Profil * |
#4 · Zasláno: 15. 2. 2006, 18:12:29
No nějak mi to nefunguje
pokud id je id kategorie a podkategorie je id podkategorie, pak nevím, protože v tabulce neuvádím podkategorii, ale nadkategorii to znamená: kategorieID NadrazenakategorieID 1_________0 .. kategorie 1 je přímo v kořenu stromu 2_________0 .. kategorie 2 je přímo v kořenu stromu 3_________1 .. kategorie 3 je podkategorií kategorie 1 |
||
ah01 Profil |
#5 · Zasláno: 15. 2. 2006, 22:39:54
doporučuju si přečíst http://interval.cz/clanek.asp?article=3801
|
||
Leo Profil |
#6 · Zasláno: 15. 2. 2006, 22:49:56
"Vlastně pro každou kategorii jeden, když si vezmeš že jich mohou být tisíce, tak to prostě nejde."
Nic vam nebrani nacist jednim selectem vsechna data a pak je rekurzivne tridit v PHP. Pokud je to struktura webu tak jich asi nebude tak moc. Leo |
||
H13 Profil * |
#7 · Zasláno: 16. 2. 2006, 17:10:24
doporučuju si přečíst http://interval.cz/clanek.asp?article=3801[/i]
díky, tohle funguje, trochu jsem si to upravil, ale funguje ... " function getTree($parent, $level) { $result = mysql_query('SELECT * FROM TREE WHERE PARENT_ID='.$parent); while ($row = mysql_fetch_assoc($result)) { echo str_repeat(" ",$level).$row['NAME']."<br />"; getTree($row['ID'], $level++); } } " |
||
Časová prodleva: 18 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0