遞歸無限分類實現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()

相關文章
相關標籤/搜索