Autor Zpráva
jckb
Profil *
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 *
Firibix:
Ahoj, už to vidím. Paráda, díky moc! :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0