Ⅰ 不用遞歸 怎麼計算無限極分類 php+mysql

直接舉個例子:

<?php
header("content-type:text/html;charset=utf-8");
$categories=array(
array('id'=>1,'name'=>'電腦','pid'=>0),
array('id'=>2,'name'=>'手機','pid'=>0),
array('id'=>3,'name'=>'筆記本','pid'=>1),
array('id'=>4,'name'=>'台式機','pid'=>1),
array('id'=>5,'name'=>'智能機','pid'=>2),
array('id'=>6,'name'=>'功能機','pid'=>2),
array('id'=>7,'name'=>'超級本','pid'=>3),
array('id'=>8,'name'=>'游戲本','pid'=>3),
);

/*======================非遞歸實現========================*/
$tree=array();
//第一步,將分類id作為數組key,並創建children單元
foreach($categoriesas$category){
$tree[$category['id']]=$category;
$tree[$category['id']]['children']=array();
}
//第二步,利用引用,將每個分類添加到父類children數組中,這樣一次遍歷即可形成樹形結構。
foreach($treeas$key=>$item){
if($item['pid']!=0){
$tree[$item['pid']]['children'][]=&$tree[$key];//注意:此處必須傳引用否則結果不對
if($tree[$key]['children']==null){
unset($tree[$key]['children']);//如果children為空,則刪除該children元素(可選)
}
}
}
////第三步,刪除無用的非根節點數據
foreach($treeas$key=>$category){
if($category['pid']!=0){
unset($tree[$key]);
}
}

print_r($tree);
?>

Ⅱ php無限極分類除了遞歸還有什麼方法

給個函數你,調用get_category()就是一個數組格式的結果
function get_category($parent_id=0){
$arr=array();
$sql = "select * from category where parent_id=$parent_id";//查詢子級數據
$result = array(a_object,b_object,,,)=sql_query($sql);//查詢結果一個數專組或列表格式,自己屬完善。
if($result){
foreach($result as $re){//循環數組
if(get_category($re.id))//如果子級不為空
$re['child'] = get_category($re.id);
$arr[] = $re;
}
return $arr;
}

Ⅲ php無限極分類實現的方法

初始化的數據

//初始化原始數據(id=>編號,name=>顯示名稱,pid=>父級目錄id,sort=>排序順序)$data[1]=array('id'=>'1','name'=>'一級目錄A','pid'=>'0','sort'=>'1');
$data[2]=array('id'=>'2','name'=>'一級目錄B','pid'=>'0','sort'=>'2');
$data[3]=array('id'=>'3','name'=>'一級目錄C','pid'=>'0','sort'=>'3');
$data[4]=array('id'=>'4','name'=>'一級目錄D','pid'=>'0','sort'=>'4');
$data[5]=array('id'=>'5','name'=>'二級目錄A-1','pid'=>'1','sort'=>'1');
$data[6]=array('id'=>'6','name'=>'二級目錄A-2','pid'=>'1','sort'=>'2');
$data[7]=array('id'=>'7','name'=>'二級目錄A-3','pid'=>'1','sort'=>'3');
$data[8]=array('id'=>'8','name'=>'二級目錄B-1','pid'=>'2','sort'=>'1');
$data[9]=array('id'=>'9','name'=>'二級目錄B-2','pid'=>'2','sort'=>'2');
$data[10]=array('id'=>'10','name'=>'二級目錄B-3','pid'=>'2','sort'=>'3');
$data[11]=array('id'=>'11','name'=>'二級目錄C-1','pid'=>'3','sort'=>'2');
$data[12]=array('id'=>'12','name'=>'二級目錄D-1','pid'=>'4','sort'=>'1');
$data[13]=array('id'=>'13','name'=>'二級目錄D-2','pid'=>'4','sort'=>'2');
$data[14]=array('id'=>'14','name'=>'三級目錄A-2-1','pid'=>'6','sort'=>'1');
$data[15]=array('id'=>'15','name'=>'三級目錄A-2-2','pid'=>'6','sort'=>'2');
$data[16]=array('id'=>'16','name'=>'三級目錄C-1-1','pid'=>'11','sort'=>'1');
$data[17]=array('id'=>'17','name'=>'三級目錄B-2-1','pid'=>'9','sort'=>'2');

顯示樹結構

functionprintTree($data,$level=0){foreach($dataas$key=>$value){for($i=0;$i<=$level;$i++){echo'&emsp;&emsp;';
}echo$value['name'];echo'<br>';if(!empty($value['children'])){
printTree($value['children'],$level+1);
}
}
}

使用遞歸的方式獲取無限極分類數組

functiongetNodeTree(&$list,&$tree,$pid=0){foreach($listas$key=>$value){if($pid==$value['pid']){
$tree[$value['id']]=$value;unset($list[$key]);
getNodeTree($list,$tree[$value['id']]['children'],$value['id']);
}
}
}

使用引用-無限極分類

functioncreateNodeTree(&$list,&$tree){foreach($listas$key=>$node){if(isset($list[$node['pid']])){
$list[$node['pid']]['children'][]=&$list[$key];
}else{
$tree[]=&$list[$node['id']];
}
}
}

調用

//遞歸-無限極分類調用getNodeTree($data,$tree);
printTree($tree);//使用引用-無限極分類調用createNodeTree($data,$tree);
printTree($tree);

Ⅳ PHP無限級分類怎麼查詢

問題太過籠統,給你一個無限極分類數據處理的一種解決方案吧
表結構
id int 主鍵
fid int 父級id, 頂級分類的fid設為0, 其它級別的分類的fid值為其父級分類的id
name char 分類名稱

若是要顯示整個分類列表,那麼你讀取整個表, 形成一個這樣結構的數組
$list = array();
while( $row = mysql_fetch_assoc($ret) ){
if( !isset($list[$row['fid']]) ) $list[$ret['fid']] = array();
$list[$ret['fid']][$ret['id']] = $row;
}
輸出時用個遞歸就可以了, 把它轉換成json,用js來做樹形菜單那也很好控制

若是查某個分類下的子分類,那查詢很簡單,就不說了

Ⅳ php遞歸無限極分類怎麼弄

給個函數你,調用get_category()就是一個數組格式的結果
function get_category($parent_id=0){
$arr=array();
$sql = "select * from category where parent_id=$parent_id";//查詢子級數據
$result = array(a_object,b_object,,,)=sql_query($sql);//查詢結果一個數組或列內表格式,自己完善。容
if($result){
foreach($result as $re){//循環數組
if(get_category($re.id))//如果子級不為空
$re['child'] = get_category($re.id);
$arr[] = $re;
}
return $arr;
}

Ⅵ php無限級分類

同一個表中存放父類和子類,但每一條記錄都要有parent_id和category_id,最頂級分類的父id為0,然後第二層分類的父id只要是相應父類的分類id,以此類推。
顯示的時候,先排序,按id就能分出來。

Ⅶ php 遞歸問題,想要將數據按照無限極分類的樣式顯示出來

首先 將json 解碼成數組, 用json_decode 函數 注意 一定要加上第二個參數 否則他會返回一個對象。接下來就是地遞歸了。這是一個最簡單的遞歸只要逐個遍歷即可。

下面是完整的代碼

$data=json_decode($str,true);
$options=getChildren($data);
functiongetChildren($parent,$deep=0){
foreach($parentas$row){
$data[]=array("id"=>$row['id'],"name"=>$row['name'],"pid"=>$row['parentid'],'deep'=>$deep);
if($row['childs']){
$data=array_merge($data,getChildren($row['childs'],$deep+1));
}
}
return$data;
}
?>
<selectname=""id="">
<?phpforeach($optionsas$row){?>
<optionvalue="<?phpecho$row['id']?>"><?phpechostr_pad("",$row['deep']*3,"-",STR_PAD_RIGHT);?><?phpecho$row['name'];?></option>
<?php}?>
</select>


以上代碼已測試通過 效果圖如下

Ⅷ php 無限極分類怎麼顯示網頁

這樣試試吧CREATE TABLE `types` (
`type_id` int(11) NOT NULL AUTO_INCREMENT,
`type_name` varchar(20) NOT NULL,
`type_p_id` varchar(64) NOT NULL DEFAULT '-',
PRIMARY KEY (`type_id`),
KEY `type_name` (`type_name`),
KEY `tname` (`type_name`)
) ENGINE=MyISAM AUTO_INCREMENT=14 DEFAULT CHARSET=utf8

註:
這里沒做欄位有效驗證;
type_id 表示主鍵自增
type_name 表示分類名
type_p_id 表示分類路徑 這里的分類路徑是 上層父類的分類路徑加上此類的主鍵id 用逗號隔開
*/
error_reporting(7);
header("Content:text/html;charset=utf-8");

//這里先進行操作的判斷
$arr = array('list','add','del','edit','addok','edit_ok');
$act= in_array($_GET['ac'],$arr)?$_GET['ac']:$arr[0];

//連接資料庫
$conn = mysql_connect("localhost","root","root")or die('資料庫連接失敗');
mysql_select_db("study",$conn);
mysql_query("set names utf8");

//根據分類層進行排序
$sql = "select * from types order by type_p_id";
$sql1 = mysql_query($sql);

//添加分類
if($act == "addok"){
$type_id = $_POST['type_id'];
$type_name = $_POST['type_name'];
//如果等於0表。如果還有不明白的話,你可以在後盾人看看視頻找找答案,有空多看看時間長了,慢慢就明白了,希望能幫到你,給個點贊吧謝謝

Ⅸ php 幾種常用的遞歸 無限極分類

/**
*遞歸實現無限極分類
*@param$array分類數據
*@param$pid父ID
*@param$level分類級別
*@return$list分好類的數組直接遍歷即可$level可以用來遍歷縮進
*/

functiongetTree($array,$pid=0,$level=0){

//聲明靜態數組,避免遞歸調用時,多次聲明導致數組覆蓋
static$list=[];foreach($arrayas$key=>$value){//第一次遍歷,找到父節點為根節點的節點也就是pid=0的節點
if($value['pid']==$pid){//父節點為根節點的節點,級別為0,也就是第一級
$value['level']=$level;//把數組放到list中
$list[]=$value;//把這個節點從數組中移除,減少後續遞歸消耗
unset($array[$key]);//開始遞歸,查找父ID為該節點ID的節點,級別則為原級別+1
getTree($array,$value['id'],$level+1);

}
}

Ⅹ 關於PHP無限極分類

functiongenTree5($items){
foreach($itemsas$item)
$items[$item['pid']]['son'][$item['id']]=&$items[$item['id']];
returnisset($items[0]['son'])?$items[0]['son']:array();
}

超級來爽的函數,格源式可能不一樣,但肯定有用,樹狀結構的輸出