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
2018-07-07 15:42:141623parcourir

Cet article présente principalement la classification infinie et les commentaires imbriqués infinis en PHP. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

Revue

. Dans l'article précédent, nous avons parlé de la récursivité, la base de la structure pratique des données PHP. Voyons ce qu'est la récursion ?

De manière générale, 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 obtenons d'abord toutes les données, puis les classons en fonction de l'identifiant 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 suivant.

<?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;
}

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Récursion sur la base de la structure de données PHP

Méthode 2 d'utilisation de XHProf pour analyser les performances PHP goulots d'étranglement

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