<?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));