Autor Zpráva
H13
Profil *
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 *
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
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:

function getKat ($id) {
$query = "SELECT * FROM Kategorie WHERE patri=$id";
$result = mysql_query($query);
while ($row = mysql_fetch_assoc ($result)) {
$return[$row['id']] = $row;
$return[$row['id']]['podkategorie'] = getKat ($row['id']);
}
return $return;
}

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 *
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
doporučuju si přečíst http://interval.cz/clanek.asp?article=3801
Leo
Profil
"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 *
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("&nbsp;",$level).$row['NAME']."<br />";
getTree($row['ID'], $level++);
}
}
"
Toto téma je uzamčeno. Odpověď nelze zaslat.