![Classification illimitée et commentaires imbriqués infinis en PHP](https://img.php.cn/upload/article/000/000/038/5d09b2eaefbdc400.png)
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.
1 2 3 4 5 6 7 | 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.
![1560920668475471.png Classification illimitée et commentaires imbriqués infinis en PHP](https://img.php.cn/upload/image/220/771/141/1560920668475471.png)
Regardons directement l'implémentation du code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?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);
|
Copier après la connexion
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.
![1560920723120918.png Classification illimitée et commentaires imbriqués infinis en PHP](https://img.php.cn/upload/image/296/755/105/1560920723120918.png)
Commentaires infiniment imbriqués
Voyons d'abord à quoi ressemblent les commentaires infiniment imbriqués. Comme le montre l'image :
![1560920774352691.png Classification illimitée et commentaires imbriqués infinis en PHP](https://img.php.cn/upload/image/568/575/182/1560920774352691.png)
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.
1 2 3 4 5 6 7 8 9 | 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 ci-dessous.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?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);
|
Copier après la connexion
Analyse de fichiers
Un exemple d'analyse de fichiers de répertoire par récursion.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?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
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!