Maison  >  Article  >  développement back-end  >  Classification illimitée et commentaires imbriqués infinis en PHP

Classification illimitée et commentaires imbriqués infinis en PHP

步履不停
步履不停original
2019-06-19 13:08:232914parcourir

Classification illimitée et commentaires imbriqués infinis en PHP

Généralement, la récursivité est appelée un appel à la fonction elle-même.

Application pratique de la récursivité dans le développement

Classification de niveau N

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.

Classification illimitée et commentaires imbriqués infinis en PHP

Regardons directement l'implémentation du code.

<?php $dsn = "mysql:host=127.0.0.1;port=3306;dbname=light-tips;charset=UTF8;";
$username = &#39;root&#39;;
$password = &#39;admin&#39;;
$pdo = new PDO($dsn, $username, $password);
$sql = &#39;SELECT * FROM `categories` ORDER BY `parentCategory`, `sortInd`&#39;;
$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.

Classification illimitée et commentaires imbriqués infinis en PHP

Commentaires infiniment imbriqués

Voyons d'abord à quoi ressemblent les commentaires infiniment imbriqués. Comme le montre l'image :

Classification illimitée et commentaires imbriqués infinis en PHP

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 = &#39;root&#39;;
$password = &#39;admin&#39;;
$pdo = new PDO($dsn, $username, $password);
$sql = &#39;SELECT * FROM `comments` WHERE `postID` = :id ORDER BY `parentId`, `datetime`&#39;;
$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);

Analyse de fichiers

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn