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

不言
Libérer: 2023-04-02 20:08:02
original
1714 Les gens l'ont consulté

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;
Copier après la connexion

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);
Copier après la connexion

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;
Copier après la connexion

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);
Copier après la connexion

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;
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal