1. 程式人生 > >無極限分類詳解

無極限分類詳解

一、.將示例 無極限分類

1.建立示例:

注:pid代表上級目錄,level代表目錄深度

<?php
header("content-type='text/html;charset=utf-8");
$arr = array(
    array('id'=>1,'name'=>'時事新聞','pid'=>0,'level'=>0),
    array('id'=>2,'name'=>'體育新聞','pid'=>0,'level'=>0),
    array('id'=>3,'name'=>'國內新聞','pid'=>1,'level'=>1),
    array('id'=>4,'name'=>'足球新聞','pid'=>2,'level'=>1),
    array('id'=>5,'name'=>'國際新聞','pid'=>1,'level'=>1),
    array('id'=>6,'name'=>'歐洲足球','pid'=>4,'level'=>2),
    array('id'=>7,'name'=>'籃球新聞','pid'=>2,'level'=>1),
    array('id'=>8,'name'=>'西甲','pid'=>6,'level'=>3),
    array('id'=>9,'name'=>'NBA','pid'=>7,'level'=>2)
);

2.輸出示例:

  •     補充說明:

 

  •    要輸出完整的樹型結構,必須使用遞迴。(因為不知道深度是多少)。
 function getTree($arr,$pid=0)
    {
        foreach ($arr as $value) {
            if ($value['pid'] == $pid) {
                //在輸出節點名稱之前,根據level的值,來決定輸出多少個空格
                echo str_repeat(' ',$value['level']). $value['name'] . "<br>";
                //2.每輸出一個頂級節點,繼續輸出其所有子節點:
                getTree($arr,$value['id']);
            }
        }
    }
    getTree($arr);

3.將原始陣列(從資料庫讀出來的陣列)改造成可直接使用foreach迴圈的陣列,可直接用foreach來進行遍歷,方便在檢視當中直接使用foreach/colist直接輸出。

改造思路:原來是輸出,現在儲存到一個新陣列,當函式結束執行時,return新陣列即可。

 function getTree($arr,$pid=0)
    {
        //使用static之後,記憶體中就只有一份$result變數
        static $result = array();
        foreach ($arr as $value) {
            if ($value['pid'] == $pid) {
                //每次輸出節點名時,將節點的整個陣列儲存到新陣列
                $result[] = $value;
                //呼叫getTree進行遞迴
                getTree($arr,$value['id']);
            }
        }
        return $result;
    }
    $a = getTree($arr);
    print_r($a);