Généralement, la récursivité est appelée un appel à la fonction elle-même.
La classification de niveau infini est une exigence courante dans le développement quotidien et est incluse dans de nombreuses questions d'entretien rencontrées. Quel que soit le projet que vous réalisez, vous devriez avoir rencontré des problèmes similaires. Ensuite, nous utiliserons l'idée de récursion pour nous entraîner.
Structure SQL
CREATE TABLE `categories` ( `id` int(11) NOT NULL AUTO_INCREMENT, `categoryName` varchar(100) NOT NULL, `parentCategory` int(11) DEFAULT '0', `sortInd` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
Ensuite on virtualise quelques données, et ça ressemble finalement à ça.
Regardons directement l'implémentation du code.
<?php $dsn = "mysql:host=127.0.0.1;port=3306;dbname=light-tips;charset=UTF8;"; $username = 'root'; $password = 'admin'; $pdo = new PDO($dsn, $username, $password); $sql = 'SELECT * FROM `categories` ORDER BY `parentCategory`, `sortInd`'; $result = $pdo->query($sql, PDO::FETCH_OBJ); $categories = [];foreach ($result as $category) { $categories[$category->parentCategory][] = $category; }function showCategoryTree($categories, $n){ if (isset($categories[$n])) { foreach ($categories[$n] as $category) { echo str_repeat('-', $n) . $category->categoryName . PHP_EOL; showCategoryTree($categories, $category->id); } } return; } showCategoryTree($categories, 0);
Comme vous pouvez le voir, nous avons d'abord obtenu toutes les données, puis les avons classées en fonction de l'identifiant du parent. Il s'agit d'une excellente structure de données. Imaginez que nous décomposons le problème de l'affichage de tous les sous-répertoires du répertoire de niveau supérieur en affichant son propre titre de catégorie et en affichant le sous-répertoire dont parentCategory est l'identifiant du répertoire actuel dans les données, puis en utilisant pour démarrer l'appel récursif. Le résultat final ressemble à ceci.
Voyons d'abord à quoi ressemblent les commentaires infiniment imbriqués. Comme le montre l'image :
Le marron ci-dessus est un autre cas classique qui peut être résolu par récursivité. Jetons un coup d'œil à la structure des données.
CREATE TABLE `comments` ( `id` int(11) NOT NULL AUTO_INCREMENT, `comment` varchar(500) NOT NULL, `username` varchar(50) NOT NULL, `datetime` datetime NOT NULL, `parentID` int(11) NOT NULL, `postID` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
Vous pouvez le pratiquer vous-même sans lire le contenu ci-dessous.
<?php $dsn = "mysql:host=127.0.0.1;port=3306;dbname=light-tips;charset=UTF8;"; $username = 'root'; $password = 'admin'; $pdo = new PDO($dsn, $username, $password); $sql = 'SELECT * FROM `comments` WHERE `postID` = :id ORDER BY `parentId`, `datetime`'; $stmt = $pdo->prepare($sql); $stmt->setFetchMode(PDO::FETCH_OBJ); $stmt->execute([':id' => 1]); $result = $stmt->fetchAll(); $comments = []; foreach ($result as $comment) { $comments[$comment->parentID][] = $comment; } function showComments(array $comments, $n) { if (isset($comments[$n])) { foreach ($comments[$n] as $comment) { echo str_repeat('-', $n) . $comment->comment . PHP_EOL; showComments($comments, $comment->id); } } return; } showComments($comments, 0);
Un exemple d'analyse de fichiers de répertoire par récursion.
<?php function showFiles(string $dir, array &$allFiles) { $files = scandir($dir); foreach ($files as $key => $value) { $path = realpath($dir . DIRECTORY_SEPARATOR . $value); if (!is_dir($path)) { $allFiles[] = $path; } else if ($value != "." && $value != "..") { showFiles($path, $allFiles); $allFiles[] = $path; } } return; } $files = []; showFiles('.', $files); foreach ($files as $file) { echo $file . PHP_EOL; }
Pour plus d'articles techniques liés à PHP, veuillez visiter la colonne Tutoriel PHP pour apprendre !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!