<?php /** * Created by PhpStorm. * User: qishou * Date: 15-8-2 * Time: 上午12:00 */ //準備數組,代替從數據庫中檢索出的數據(共有三個必須字段id,name,pid) 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($categories as $category){ $tree[$category['id']] = $category; $tree[$category['id']]['children'] = array(); } //第二步,利用引用,將每一個分類添加到父類children數組中,這樣一次遍歷便可造成樹形結構。 foreach($tree as $key=>$item){ if($item['pid'] != 0){ $tree[$item['pid']]['children'][] = &$tree[$key];//注意:此處必須傳引用不然結果不對 if($tree[$key]['children'] == null){ unset($tree[$key]['children']); //若是children爲空,則刪除該children元素(可選) } } } ////第三步,刪除無用的非根節點數據 foreach($tree as $key=>$category){ if($category['pid'] != 0){ unset($tree[$key]); } } print_r($tree); /*======================遞歸實現========================*/ $tree = $categories; function get_attr($a,$pid){ $tree = array(); //每次都聲明一個新數組用來放子元素 foreach($a as $v){ if($v['pid'] == $pid){ //匹配子記錄 $v['children'] = get_attr($a,$v['id']); //遞歸獲取子記錄 if($v['children'] == null){ unset($v['children']); //若是子元素爲空則unset()進行刪除,說明已經到該分支的最後一個元素了(可選) } $tree[] = $v; //將記錄存入新數組 } } return $tree; //返回新數組 } echo "<br/><br/><br/>"; print_r(get_attr($tree,0));