本文作者:心月

php递归实现无限极分类

心月IT博客 2019-04-10
php递归实现无限极分类摘要:无限极分类是指通过指定一个顶级分类,自动获取这个分类下的所以子孙级分类,直至取完这个顶级分类所包含的所有分类。这个功能在web网站中非常常见,比如jd,天猫,苏宁易购等商城的产品分类。

    无限极分类是指通过指定一个顶级分类,自动获取这个分类下的所以子孙级分类,直至取完这个顶级分类所包含的所有分类。这个功能在web网站中非常常见,比如jd,天猫,苏宁易购等商城的产品分类。

无限极分类

实现无限极分类的方法不唯一,今天这里就分享下通过php递归方法实现无限极分类。

先来看下分类的数据表

无限极分类数据表

无限极分类数据表

表中需要关注的字段catid:分类id,parentid:父级分类id,child:是否有子分类,(siteid这个字段不用关注),catname:分类名称,arrchildid:这个字段存放的是当前分类及其子分类的id,这里也用不到,实现无限极分类后可以用该字段来验证分类是否正确。

 递归实现无限极分类的具体方法步骤:

实现无限极分类主要分为两大步:获取数据——输出数据。

1、获取数据:

<?php
    
    //在实际项目中可以通过类的方式来实现无线分类,把数据库连接资源句柄放到类的初始化中,避免在获取分类时重复连接数据库
	try{
		
		/**
		 * 分类获取
		 */
		function getCategorys($pid, $list = []){
                        //pdo资源句柄,在实际项目中不应该放在方法内
			$pdo = new PDO('mysql:host=localhost;dbname=phpcmsv9hfzx', 'root', 'root');
			$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

			$sql = 'select * from v9_category where parentid=:parentid';
			$stmt = $pdo->prepare($sql);
			$pid = intval($pid);
			$stmt->bindParam(':parentid', $pid);

			$stmt->execute();
			$res = $stmt->fetchAll(PDO::FETCH_ASSOC);
                        
                        //遍历取出的数据,如果有子分类则通过递归继续取下级分类数据
			foreach ($res as $key => $value) {
				$childList = [];
				if($value['child']){
					$childList = getCategorys($value['catid']);
				}

				$list[] = [
					'catid' => $value['catid'],
					'catname' => $value['catname'],
					'child' => $value['child'],
					'childList' => $childList
				]; 
			}
			
			return $list;
		}


	}catch(PDOException $e){
		echo $e->getMessage();
	}

递归获取分类数据:

    首先取出指定顶级分类下的分类,然后遍历其分类并判断其是否还有下级分类,如果有继续取出分类数据,然后再次遍历去除的下级分类...取分类-遍历判断是一个往复的过程,因此可以使用递归来实现。每次遍历完之后把数据返回出去,外层接收返回数据,并放到其子分类下。

    之所以采用这种方式,是为了让父级分类和子级分类有个明显的层次关系,让我们取出来的数据即使不输出也可以一目了然,而且有时可能只要父级分类不需要子级分类,在输出父级分类的时候直接跳过子级分类判断即可。


2、数据输出

<?php

	try{
		
		/**
		 * 分类获取
		 */
		function getCategorys($pid, $list = []){

			$pdo = new PDO('mysql:host=localhost;dbname=phpcmsv9hfzx', 'root', 'root');
			$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

			$sql = 'select * from v9_category where parentid=:parentid';
			$stmt = $pdo->prepare($sql);
			$pid = intval($pid);
			$stmt->bindParam(':parentid', $pid);

			$stmt->execute();
			$res = $stmt->fetchAll(PDO::FETCH_ASSOC);

			foreach ($res as $key => $value) {
				$childList = [];
				if($value['child']){
					$childList = getCategorys($value['catid']);
				}

				$list[] = [
					'catid' => $value['catid'],
					'catname' => $value['catname'],
					'child' => $value['child'],
					'childList' => $childList
				]; 
			}
			
			return $list;
		}

		/**
		 * 分类遍历
		 */
		function nav($list, &$str=''){
			$str.='<ul class="list">';
			foreach ($list as $key => $value) {
				$str.= '<li>'.$value['catname'];
				//判断是否有子级分类且子级分类是否不为空
				if($value['child'] && !empty($value['childList'])){
					nav($value['childList'], $str);
				}
				$str.='</li>';
			}
			$str.='</ul>';

			return $str;
		}

		/**
		 * 输出分类
		 */
		function navList($pid){
			$navArr = getCategorys($pid);

			return nav($navArr);
		}

		echo navList(0);

	}catch(PDOException $e){
		echo $e->getMessage();
	}


分类输出拆分为了两步:分类遍历-数据输出。

在遍历分类的时候同样需要用到递归遍历,遍历当前分类的同时判断是否有子分类,有则继续遍历子分类。


最终的无限极分类效果:

递归无限极分类效果


文章版权及转载声明:

本文由 心月IT技术博客 博主整理于 2019-04-10
若转载请注明原文及出处:https://www.xinyueseo.com/other/232.html

分享到:
赞(
发表评论
快捷输入:

验证码

    评论列表 (有 0 条评论,人围观)参与讨论