递归无限分类实现1

#递归实现无线分类php

##1.两种使用场景mysql

  • 分类下拉列表
  • 面包屑导航

2.分类下来列表

分类下拉类表主要使用在后台添加商品或者文章界面选择分类的时候。sql

  1. 用什么体现下拉缩进
  2. 实现原理 (where pid=id); 经过父的pid做为id,再把id做为pid去找自级别
  3. 根节点的pid=0;
  4. 返回值的用参数引用 &result=array()保存

db数据库

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for catedeep
-- ----------------------------
DROP TABLE IF EXISTS `catedeep`;
CREATE TABLE `catedeep` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pid` int(11) NOT NULL DEFAULT '0' COMMENT '父级ID',
  `catename` varchar(25) DEFAULT NULL COMMENT '分类名称',
  `order` int(11) DEFAULT '100' COMMENT '排序',
  `createtime` datetime NOT NULL,
  `updatetime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

connect数组

$db_host="localhost";
$db_user="root";
$db_password="root";
$db_name="test";
$con=mysql_connect($db_host,$db_name,$db_password)or die(mysql_error());
mysql_select_db($db_name,$con)or die(mysql_error());
mysql_query("set names utf8")or die("编码设置错误");

code函数

/**
 * [combobox description]
 * @param  integer $pid     [父级id根节点为0]
 * @param  array   &$result [递归保存的数组,以参数引用的方式传递]
 * @param  integer $spac    [缩进体现的数量]
 * @return [type]           [description]
 */
function combobox($pid=0,&$result=array(),$spac=0){

	$spac=$spac+2;
	$sql="select * from deepcate where pid=$pid";
	$res=mysql_query($sql);//结果集
	while($row=mysql_fetch_assoc($res)){//首先读书一级分类,得到一级的id并把它做为下一次递归的条件去找子集

		$row['catename']=str_repeat(" ",$spac).$row['catename'];
		$result[]=$row;//数据保存数组
         combobox($row['id'],$result,$spac);

         //找个一个分类的全部再找下一个分类
	}
	return   $result;
}

核心关键点就是查询where pid=id(父级ID),可不能够一次查出全部须要的数据再循环遍历呢oop

<?php 


$db_host="localhost";
$db_user="root";
$db_password="root";
$db_name="deeploop";
$con=mysqli_connect($db_host,$db_user,$db_password,$db_name);

mysqli_query($con,"set names utf8");

/**
* [combobox description]
* @param  integer $pid     [父级id根节点为0]
* @param  array   &$result [递归保存的数组,以参数引用的方式传递]
* @param  integer $spac    [缩进体现的数量]
* @return [type]           [description]
*/
function combobox($pid=0,&$result=array(),$spac=0){
	 global $con;
	$spac=$spac+2;
	$sql="select * from catedeep where pid=$pid";
	$res=mysqli_query($con ,$sql);//结果集
	while($row=mysqli_fetch_assoc($res)){//首先读书一级分类,得到一级的id并把它做为下一次递归的条件去找子集

		$row['catename']=str_repeat("&nbsp;",$spac).$row['catename'];
		$result[]=$row;//数据保存数组
        combobox($row['id'],$result,$spac);

        //找个一个分类的全部再找下一个分类
	}
	return   $result;
}

$res=combobox();

echo "<pre/>";
print_r($res);



?>

2.1能够增强的地方

写一个试图ui 穿参数设置默认选中谁(编辑的时候的)fetch

##3.面包屑导航实现ui

面包屑导航在前台显示路劲或者所属分类的时候用到编码

  1. 如今原理sql查询(where id=pid)经过子级别的id获得pid,把pid为了父级别id往上找父类

code

<?php 


$db_host="localhost";
$db_user="root";
$db_password="root";
$db_name="deeploop";
$con=mysqli_connect($db_host,$db_user,$db_password,$db_name);

mysqli_query($con,"set names utf8");

/**
 * [combobox description]
 * @param  integer $pid     [父级id根节点为0]
 * @param  array   &$result [递归保存的数组,以参数引用的方式传递]
 * @param  integer $spac    [缩进体现的数量]
 * @return [type]           [description]
 */
function breadcrumbs($id,&$result=array()){
	 global $con;
	$sql="select * from catedeep where id=$id";
	$res=mysqli_query($con ,$sql);//结果集
$row=mysqli_fetch_assoc($res);//找到一条分类记录,找到记录中的中的pid做为下一查询的条件
	if($row){
		$result[]=$row;
      breadcrumbs($row['pid'],$result);

	}

	echo 11;
	krsort($result);
	return   $result;
}

$res=breadcrumbs(6);

echo "<pre/>";
print_r($res);


 ?>

4.总结

  1. 两个方法的缺点

在方法中查询数据库好很差呢?

  1. 两个函数
  • krsort()

  • str_reapeat()

相关文章
相关标签/搜索