Autor | Zpráva | ||
---|---|---|---|
hondziiikh Profil |
#1 · Zasláno: 4. 6. 2018, 11:05:14
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 |
#2 · Zasláno: 4. 6. 2018, 11:30:30
Musíš si to uložit jinak , tady máš několik způsobů forum.nette.org/cs/30360-dynamicke-menu-z-databaze#p196552
|
||
hondziiikh Profil |
#3 · Zasláno: 5. 6. 2018, 07:57:15
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 |
#4 · Zasláno: 5. 6. 2018, 10:13:11
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 |
#5 · Zasláno: 5. 6. 2018, 10:42:38
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, ) ); 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 ) ) ) ) ) ) ) ) ) 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). |
||
Časová prodleva: 6 let
|
0