回顾上一篇文章,我们根据实际的PHP数据结构讲了递归。让我们回顾一下什么是递归?通常,递归指的是对函数本身的调用。递归在开发中的实际应用N级分类无限级分类是普通开发中的常见需求,在很多面试题中都会遇到。不管你做什么项目,你应该都遇到过类似的问题。接下来我们就用递归的思想来实践一下。SQL结构CREATETABLE`categories`(`id`int(11)NOTNULLAUTO_INCREMENT,`categoryName`varchar(100)NOTNULL,`parentCategory`int(11)DEFAULT'0',`sortInd`int(11)NOTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=11DEFAULTCHARSET=utf8;然后我们把一些数据虚拟出来,最后变成这个样子。我们直接看代码实现。query($sql,PDO::FETCH_OBJ);$categories=[];foreach($resultas$category){$categories[$category->parentCategory][]=$category;}函数showCategoryTree($categories,$n){if(isset($categories[$n])){foreach($categories[$n]as$category){echostr_repeat('-',$n).$类别->类别名称。PHP_EOL;showCategoryTree($类别,$category->id);}}return;}showCategoryTree($categories,0);可以看到,我们先获取了所有的数据,然后根据parentID进行分类。这是一个非常酷的数据结构。想象一下,我们将显示顶级目录下所有子目录的问题分解为显示自己的分类标题和显示数据中parentCategory为当前目录id的子目录,然后用来开始递归调用。最终输出如下所示。无限嵌套的评论我们先来看看这个无限嵌套的评论长什么样子。如图:上面的栗子是另一个可以使用递归解决的经典案例。或者看看数据结构。CREATETABLE`comments`(`id`int(11)NOTNULLAUTO_INCREMENT,`comment`varchar(500)NOTNULL,`username`varchar(50)NOTNULL,`datetime`datetimeNOTNULL,`parentID`int(11)NOTNULL,`postID`int(11)NOTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=11DEFAULTCHARSET=latin1;你可以自己练习,不要先看下面的内容。prepare($sql);$stmt->setFetchMode(PDO::FETCH_OBJ);$stmt->execute([':id'=>1]);$result=$stmt->fetchAll();$comments=[];foreach($resultas$comment){$comments[$comment->parentID][]=$comment;}functionshowComments(array$comments,$n){if(isset($comments[$n])){foreach($comments[$n]as$comment){echostr_repeat('-',$n).$评论->评论。PHP_EOL;showComments($comments,$comment->id);}}return;}showComments($comments,0);使用递归扫描目录文件的文件扫描栗子。$value){$path=realpath($dir.DIRECTORY_SEPARATOR.$value);如果(!is_dir($path)){$allFiles[]=$path;}elseif($value!="."&&$value!=".."){showFiles($path,$allFiles);$allFiles[]=$路径;}}return;}$files=[];showFiles('.',$files);foreach($filesas$file){echo$file.PHP_EOL;}更多PHP基础数据结构专题系列目录地址:该地址主要使用PHP语法对基本的数据结构和算法进行总结。还有我们日常PHP开发中容易忽略的基础知识和现代PHP开发中规范、部署、优化的一些实用建议,以及对Javascript语言特性的深入研究。
