Rekurzív MySQLi listázás PHP-vel

Rekurzív MySQLi listázás PHP-vel
2021-04-29T16:00:56+02:00
2021-04-29T18:23:43+02:00
2022-10-15T21:16:21+02:00
*deleted_23419333
Sziasztok!

Van egy MySQL táblám:

CREATE TABLE `files` ( `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` text NOT NULL, -- a fájl vagy a mappa neve `content` longtext DEFAULT NULL, -- a fájl tartalma (mappa esetén NULL) `dir_id` int(11) DEFAULT NULL, -- ha fájl, akkor annak a mappának az azonosítója, ahol található, ha mappa, akkor annak a mappának az azonosítója amibe benne van `is_dir` int(11) NOT NULL DEFAULT 0 -- fájl (0) vagy mappa (1) );

Adatok:

INSERT INTO `files` (`id`,`name`,`content`,`dir_id`,`is_dir`) VALUES ( 1, 'első fájl', 'a', NULL, 0 ); INSERT INTO `files` (`id`,`name`,`content`,`dir_id`,`is_dir`) VALUES ( 2, 'második fájl', 'b', NULL, 0 ); INSERT INTO `files` (`id`,`name`,`content`,`dir_id`,`is_dir`) VALUES ( 3, 'első mappa', NULL, NULL, 1 ); INSERT INTO `files` (`id`,`name`,`content`,`dir_id`,`is_dir`) VALUES ( 4, 'első mappa első fájla', 'c', 3, 0 ); INSERT INTO `files` (`id`,`name`,`content`,`dir_id`,`is_dir`) VALUES ( 5, 'első mappa első mappája', NULL, 3, 1 ); INSERT INTO `files` (`id`,`name`,`content`,`dir_id`,`is_dir`) VALUES ( 6, 'első mappa első mappájának első fájla', 'd', 5, 0 );

Amit kapni szeretnék:

<ul> <li>első mappa<ul> <li>első mappa első mappája<ul> <li><a href="6">első mappa első mappájának első fájla</a></li> </ul></li> <li><a href="4">első mappa első fájla</a></li> </ul></li> <li><a href="1">első fájl</a></li> <li><a href="2">második fájl</a></li> </ul>

A listázásnál mindig előre a mappákat, majd utána a fájlokat, illetve ABC sorrendben mindig mindent a `name` oszlop szerint.

Hogyan tudnám ezt megvalósítani? Az elmélet meg van (rekurzió), de megfelelő tudás híján képtelen vagyok a megvalósítására.

<?php $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db'); ?>

Előre is köszönöm a segítséget.
Mutasd a teljes hozzászólást!
Hali!

Hogyan tudnám ezt megvalósítani?

Például (persze, ez függ attól, hogy mennyi sorod van/lesz a táblában):
function createTreeHTML(array $folder, int $parent = 0, int $level = 0, string $indent = "\t") { $result = "\n".str_repeat($indent, $level)."<ul>"; $thisLevel = array_filter($folder, function($el) use ($parent) { return $el['dir_id'] == $parent; }); foreach ($thisLevel as $entity) { $result .= "\n".str_repeat($indent, $level + 1)."<li>"; if ($entity['is_dir']) { $result .= $entity['name'].createTreeHTML($folder, $entity['id'], $level + 2, $indent); $result .= "\n".str_repeat($indent, $level + 1)."</li>"; } else { $result .= '<a href="'.$entity['id'].'">'.$entity['name'].'</a></li>'; } } $result .= "\n".str_repeat($indent, $level)."</ul>"; return $result; } $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db'); $result = $mysqli->query("SELECT * FROM `files` ORDER BY `is_dir` DESC, `name` ASC"); $files = $result->fetch_all(MYSQLI_ASSOC); echo htmlspecialchars(createTreeHTML($files));
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd