Autor Zpráva
hondziiikh
Profil
ahojte, prosím o radu, řeším, jak rekurzivně procházet tabulku služeb a jejich rodičů, aby výsledek byl např.

Blade01 > BladeChasisDC1 > switchL02-P06 > switchL02-UP > MAINROUTER
Blade04 > BladeChasisDC1 > switchL02-P06 > switchL02-UP > MAINROUTER

atd., dle tabulky níže. Každý řádek má rodiče, kromě TOP služeb, které mají nulu.

SQL

id   |    serviceName      |    serviceParent
1    |    Blade01          |    3
2    |    Blade04          |    3
3    |    BladeChasisDC1   |    4
4    |    switchL02-P06    |    6
5    |    switchL02-P08    |    6
6    |    switchL02-UP     |    7
7    |    MAINROUTER       |    0

PHP


function selectServices($serviceId) {
    $loadServices = mysqli_query(dbConnect(), "SELECT * FROM services WHERE id IN ($serviceId)");

    $services = array();
    
    while ($listOfServices = mysqli_fetch_assoc($loadServices))
    {
        $services[] = $listOfServices;
        
        if($listOfServices['serviceParent']!="0")
        {
            $services[] = selectServices($listOfServices['serviceParent']);
        }
    };
    return $services;
}

funkce vypíše službu a pokud není serviceParent 0, tak zavolá sama sebe znovu a přidá další záznam do pole.

Co řeším je, jak to vyrenderovat v HTML. Dám li print_r dle přídkladu, dostanu sice krásné pole, ale nevím, jak ho projít celé. Chtěl jsem celý foreach dát do while, ale zase ta funkce nahoře nedává smysl. Předělávám to pořád dokola a už jsem v konci. Neřešil jste někdo něco podobného? :-)


<?php foreach (selectServices(1) as $subservice): ?>
    <pre>
        <?php print_r($subservice); ?>
    </pre>
<?php endforeach ?>

Výsledek pad vypadá takto:
Array
(
    [0] => Array
        (
            [id] => 1
            [serviceName] => Blade01
            [serviceParent] => 3
        )
    [1] => Array
        (
            [0] => Array
                (
                    [id] => 3
                    [serviceName] => BladeChasisDC1
                    [serviceParent] => 4
                )
            [1] => Array
                (
                    [0] => Array
                        (
                            [id] => 4
                            [serviceName] => switchL02-P06
                            [serviceParent] => 6
                        )
                    [1] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 6
                                    [serviceName] => switchL02-UP
                                    [serviceParent] => 7
                                )
                            [1] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 7
                                            [serviceName] => MAINROUTER
                                            [serviceParent] => 0
                                        )
                                )
                        )
                )
        )
)

Moc díky za jakékoliv nakopnutí správným směrem.
Kcko
Profil
Musíš si to uložit jinak , tady máš několik způsobů forum.nette.org/cs/30360-dynamicke-menu-z-databaze#p196552
hondziiikh
Profil
Kcko:
Ahoj, děkuji za odpověď. Předelal jsem si to už v té funkci, že nedělá return ale rovnou echuje výsledky, a v podstatě jsem dosáhl výsledku. Sice krkolomně, ale dosáhl. Ze zaslaného jsem to nepobral úplně, nebyl by prosím spíš nějakej špagetovej kód? Ještě bych upravil, přecijen bych to měl radši správně (tedy až tak správně, jak jen špagety dovolí :-D )

Jen ještě - kdekoliv uprostřed toho vypisu se to může znovu rozdělit, má to ukazovat na jakém rodiči je "služba" přímo závislá. Tedy switch může mít např. 2x uplink a bude se dělit na dva další. Moc děkuji ještě jednou
Kajman
Profil
Pokud vypisujete všechny služby, tak jedním dotaze načtěte z db do php pole všechny řádku. V rekurzivní fuknci pak používejte to pole bez dotazů do databáze, bude to rychlejší.

MariaDB od verze 10.2.2 už umí vypsat přímo strom.
hondziiikh
Profil
Kajman:
Zdravím, na serveru je 10.1.26 :( Nicméně jsem poupravil fci dle instrukcí od Kcko, a výsledek vypadá přehledněji Pole z DB dám rovnou do PHP pole
$services = array(
    array(
        'id' => 7,
        'name' => 'MAINROUTER',
        'parent_id' => 0,
    ),
    array(
        'id' => 6,
        'name' => 'switchL02-UP',
        'parent_id' => 7,
    ),
    array(
        'id' => 5,
        'name' => 'switchL02-P08',
        'parent_id' => 6,
    ),
    
    array(
        'id' => 4,
        'name' => 'switchL02-P06',
        'parent_id' => 6,
    ),
    array(
        'id' => 3,
        'name' => 'BladeChasisDC1',
        'parent_id' => 4,
    ),
    array(
        'id' => 2,
        'name' => 'Blade04',
        'parent_id' => 3,
    ),
    array(
        'id' => 1,
        'name' => 'Blade01',
        'parent_id' => 3,
    ),
    array(
        'id' => 8,
        'name' => 'BladeChasisDC2',
        'parent_id' => 5,
    ),
    array(
        'id' => 9,
        'name' => 'Blade08',
        'parent_id' => 8,

        )
);
funkce nyní vypadá následovně:
function buildTree(array $elements, $parentId = 0) {
    $branch = array();

    foreach ($elements as $element) {
        if ($element['parent_id'] == $parentId) {
            $children = buildTree($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[] = $element;
        }
    }

    return $branch;
}

$tree = buildTree($services)[0];

echo "<pre>";
print_r($tree);
echo "</pre>";

Po print_f vypadá výsledek takto:

Array
(
    [id] => 7
    [name] => MAINROUTER
    [parent_id] => 0
    [children] => Array
        (
            [0] => Array
                (
                    [id] => 6
                    [name] => switchL02-UP
                    [parent_id] => 7
                    [children] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 5
                                    [name] => switchL02-P08
                                    [parent_id] => 6
                                    [children] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [id] => 8
                                                    [name] => BladeChasisDC2
                                                    [parent_id] => 5
                                                    [children] => Array
                                                        (
                                                            [0] => Array
                                                                (
                                                                    [id] => 9
                                                                    [name] => Blade08
                                                                    [parent_id] => 8
                                                                )

                                                        )

                                                )

                                        )

                                )

                            [1] => Array
                                (
                                    [id] => 4
                                    [name] => switchL02-P06
                                    [parent_id] => 6
                                    [children] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [id] => 3
                                                    [name] => BladeChasisDC1
                                                    [parent_id] => 4
                                                    [children] => Array
                                                        (
                                                            [0] => Array
                                                                (
                                                                    [id] => 2
                                                                    [name] => Blade04
                                                                    [parent_id] => 3
                                                                )

                                                            [1] => Array
                                                                (
                                                                    [id] => 1
                                                                    [name] => Blade01
                                                                    [parent_id] => 3
                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)
Ale stále mi teď zůstává otázkou, jak tento výsledek vyrenderovat na stránku, aby to vypadalo následovně:
např zeptám-li se na BladeChasisDC2
BladeChasisDC2 > switchL02-P08 > switchL02-UP > MAINROUTER (nebo klidně naopak, od MAINROUTER dolů, to je asi putna)
nebo zeptám li se na Blade01
Blade01 > BladeChasisDC1 > switchL02-P06 > switchL02-UP > MAINROUTER
---
Pokud mi někdo prosím poradí jak z výsledku z funkce výše udělat tento styl zápisu, je vyřešeno. Zkoušel jsem foreachem procházet, ale nedokážu vystihnout tu logiku :-(


Moc díky za cokoliv
Kcko
Profil
hondziiikh:
Ahoj, tady máš tu nejjednodušší špagetárnu. Umí výpis rekurzivne i drobečkovou navigaci.

lab.rjwebdesign.cz/dbmenu/simple-tree-my-menu.php
lab.rjwebdesign.cz/dbmenu/simple-tree-my-menu.phps (zdroj)

Ta funkce má parametr, kterým si můžeš navigaci rozbalit po kliku nebo celou najednou, jednodušší už to být asi nemůže.
Nahoře máš pole, jak si to z DB vyskládáš (nic složitého).

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: