Autor | Zpráva | ||
---|---|---|---|
jckb Profil * |
#1 · Zasláno: 4. 2. 2021, 18:19:48
Dobrý den, nedaří se mi vypsat strom kategorií. Pokud smažu kategorii která má sub-kategorie, chci přesunout polužky do nezařazené kategorie. Vždy mi to nějakou kategorii co by to mělo odstranit vynechá.
Tabulka: |---------|---------|---------| | id | parent | name | |---------|---------|---------| | 15 | 0 | cat | | 16 | 15 | cat1 | | 17 | 15 | cat2 | | 19 | 16 | cat1.1 | | 20 | 17 | cat2.1 | | 21 | 17 | cat2.2 | |---------|---------|---------| Strom vypadá takto: Cat > Cat 1 > > Cat 1.1 > Cat 2 > > Cat 2.1 > > Cat 2.2 Čísla (id) které dostanu ke smazání jsou 15,16,17,20,21 a chybí tam č. 19. Script: $i = 0; $id = 15; echo $id . "<br>"; while(true){ $i++; if($i > 12){break;} // Break zatím neřeším, tak toto je vypínač while $q = $db->query("SELECT * FROM category WHERE parent='$id'"); if($q->num_rows){ while($r = $q->fetch_object()){ $id = $r->id; echo $id . "<br>"; } } } Nevíte někdo co s tím? Děkuji :) |
||
Firibix Profil |
Reakce na jckba:
Stačí si rozmyslet, co tvůj algoritmus dělá. Při první iteraci pro $id = 15 dotaz na databázi vrátí kategorie 16 a 17, vnořený cyklus nastaví $id na 16 a hned vzápětí na 17, takže vnější while pokračuje pro $id = 17 a potomky kategorie 16 přeskočí.
Lepší by bylo si všechny nově objevené podkategorie ukládat do fronty a tu zpracovávat: $queue = new \SplQueue(); $queue->enqueue(15); // kategorie, od které chceme najít všechny potomky while (!$queue->isEmpty()) { $category = $queue->dequeue(); $children = $db->query('SELECT `id` FROM category WHERE parent = '.intval($category)); while ($child = $children->fetch_object()) { $queue->enqueue($child->id); echo $child->id.'<br>'; } } |
||
jckb Profil * |
#3 · Zasláno: 4. 2. 2021, 20:20:45
Firibix:
Ahoj, už to vidím. Paráda, díky moc! :) |
||
Časová prodleva: 3 roky
|
0