天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

PHP無限分類(樹形類)的深入分析

php無限分類,Google一下就能找到很多相關資料,思路比較拉風的,也是用得比較多的就是分類表至少有id,pid,name三個字段,id自增表分類,pid為父分類,name為分類名,這樣就構成了一棵樹,如下,算是我查詢分類表得到的結果集。
復制代碼 代碼如下:
<?php
//模擬php無限分類查詢結果
return array(
    array(
        'id'=>1,
        'pid'=>0,
        'name'=>'主頁'
    ),
    array(
        'id'=>2,
        'pid'=>0,
        'name'=>'新聞'
    ),
    array(
        'id'=>3,
        'pid'=>0,
        'name'=>'媒體'
    ),
    array(
        'id'=>4,
        'pid'=>0,
        'name'=>'下載'
    ),
    array(
        'id'=>5,
        'pid'=>0,
        'name'=>'關于我們'
    ),
    array(
        'id'=>6,
        'pid'=>2,
        'name'=>'天朝新聞'
    ),
    array(
        'id'=>7,
        'pid'=>2,
        'name'=>'海外新聞'
    ),
    array(
        'id'=>8,
        'pid'=>6,
        'name'=>'州官新聞'
    ),
    array(
        'id'=>9,
        'pid'=>3,
        'name'=>'音樂'
    ),
    array(
        'id'=>10,
        'pid'=>3,
        'name'=>'電影'
    ),
    array(
        'id'=>11,
        'pid'=>3,
        'name'=>'小說'
    ),
    array(
        'id'=>12,
        'pid'=>9,
        'name'=>'鈴聲'
    ),
    array(
        'id'=>13,
        'pid'=>9,
        'name'=>'流行音樂'
    ),
    array(
        'id'=>14,
        'pid'=>9,
        'name'=>'古典音樂'
    ),
    array(
        'id'=>15,
        'pid'=>12,
        'name'=>'熱門鈴聲'
    ),
    array(
        'id'=>16,
        'pid'=>12,
        'name'=>'搞笑鈴聲'
    ),
    array(
        'id'=>17,
        'pid'=>12,
        'name'=>'MP3鈴聲'
    ),
    array(
        'id'=>18,
        'pid'=>17,
        'name'=>'128K'
    ),
    array(
        'id'=>19,
        'pid'=>8,
        'name'=>'娛樂新聞'
    ),
    array(
        'id'=>20,
        'pid'=>11,
        'name'=>'穿越類'
    ),
    array(
        'id'=>21,
        'pid'=>11,
        'name'=>'武俠類'
    ),
);
?>

拉風歸拉風,但是那些文章提供的無限分類的類相關操作有點挫,直接把對數據庫操作也封裝進去了。也就是別人要用你這個類,還要跟你建一樣的表,真TM惡心。由于項目要用到,所以自己寫了一個php無限分類的類(也稱樹形類),沒有數據庫的操作,只需要實例化的時候傳進去結果集,也就是樹形數組。再執行leaf方法或navi方法即可得到想要的結果,下面請看源碼,看完之后奉上smarty模板引擎的相應的模板遞歸方法。
復制代碼 代碼如下:
<?php
/**
 * Tree 樹型類(無限分類)
 *
 * @author Kvoid
 * @copyright http://kvoid.com
 * @version 1.0
 * @access public
 * @example
 *   $tree= new Tree($result);
 *   $arr=$tree->leaf(0);
 *   $nav=$tree->navi(15);
 */
class Tree {
    private $result;
    private $tmp;
    private $arr;
    private $already = array();
    /**
     * 構造函數
     *
     * @param array $result 樹型數據表結果集
     * @param array $fields 樹型數據表字段,array(分類id,父id)
     * @param integer $root 頂級分類的父id
     */
    public function __construct($result, $fields = array('id', 'pid'), $root = 0) {
        $this->result = $result;
        $this->fields = $fields;
        $this->root = $root;
        $this->handler();
    }
    /**
     * 樹型數據表結果集處理
     */
    private function handler() {
        foreach ($this->result as $node) {
            $tmp[$node[$this->fields[1]]][] = $node;
        }
        krsort($tmp);
        for ($i = count($tmp); $i > 0; $i--) {
            foreach ($tmp as $k => $v) {
                if (!in_array($k, $this->already)) {
                    if (!$this->tmp) {
                        $this->tmp = array($k, $v);
                        $this->already[] = $k;
                        continue;
                    } else {
                        foreach ($v as $key => $value) {
                            if ($value[$this->fields[0]] == $this->tmp[0]) {
                                $tmp[$k][$key]['child'] = $this->tmp[1];
                                $this->tmp = array($k, $tmp[$k]);
                            }
                        }
                    }
                }
            }
            $this->tmp = null;
        }
        $this->tmp = $tmp;
    }
    /**
     * 反向遞歸
     */
    private function recur_n($arr, $id) {
        foreach ($arr as $v) {
            if ($v[$this->fields[0]] == $id) {
                $this->arr[] = $v;
                if ($v[$this->fields[1]] != $this->root) $this->recur_n($arr, $v[$this->fields[1]]);
            }
        }
    }
    /**
     * 正向遞歸
     */
    private function recur_p($arr) {
        foreach ($arr as $v) {
            $this->arr[] = $v[$this->fields[0]];
            if ($v['child']) $this->recur_p($v['child']);
        }
    }
    /**
     * 菜單 多維數組
     *
     * @param integer $id 分類id
     * @return array 返回分支,默認返回整個樹
     */
    public function leaf($id = null) {
        $id = ($id == null) ? $this->root : $id;
        return $this->tmp[$id];
    }
    /**
     * 導航 一維數組
     *
     * @param integer $id 分類id
     * @return array 返回單線分類直到頂級分類
     */
    public function navi($id) {
        $this->arr = null;
        $this->recur_n($this->result, $id);
        krsort($this->arr);
        return $this->arr;
    }
    /**
     * 散落 一維數組
     *
     * @param integer $id 分類id
     * @return array 返回leaf下所有分類id
     */
    public function leafid($id) {
        $this->arr = null;
        $this->arr[] = $id;
        $this->recur_p($this->leaf($id));
        return $this->arr;
    }
}
?>

在smarty中的php無限分類的使用方法:
$result=$db->query(……);//這里查詢得到結果集,注意結果集為數組
$tree= new Tree($result);
$arr=$tree->leaf(0);
$nav=$tree->navi(15);
$smarty->assign(‘arr',$arr);
$smarty->assign(‘nav',$nav);
$smarty->display(‘test.html');
在smarty模板中這樣遞歸:
復制代碼 代碼如下:
<!--導航-->
<div id="navigator">
<{foreach $nav as $n}>
    <{if $n@iteration != $n@last}>
        <{$n.name}> ->
    <{else}>
        <{$n.name}>
    <{/if}>
<{/foreach}>
</div>
<!--樹形菜單-->
<div id="menu">
<{function name=menu}>
    <ul>
        <{foreach $data as $entry}>
            <li>
                <span><{$entry.name}></span> <{*注意字段要改成自己的字段哦*}>
            <{if isset($entry.child)}>
                <{call name=menu data=$entry.child}>
            <{/if}>
            </li>
        <{/foreach}>
    </ul>
<{/function}>
<{call name=menu data=$arr}> <{*注意在這里$arr才是模板變量*}>
</div>

當然,你也可以更改遞歸方法,用你想的標簽不受拘束。HTML+php混編的遞歸方法這里就不貼了,我也懶得寫,最討厭混編,看著惡心,在這里推薦一下jake前輩的Speedphp框架,由于默認的引擎是smarty,我的這個php無限分類完全兼容SP框架。同樣的,jquery的treeview插件和下拉菜單插件也完美支持。
對了,建議使用Smarty強大的緩存功能,緩存才是王道。

php技術PHP無限分類(樹形類)的深入分析,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 欧美激情性AAAAA片欧美 | 日本学生VIDEOVIDEOS更新 日本性xxx | 国产精品一区二区激情 | 诱受H嗯啊巨肉舍友1V1 | 3a丝袜论坛 | 国产精品无码AV天天爽人妻蜜桃 | 国产在线一区观看 | JIZJIZJIZ 日本老师水多 | 开心色99xxxx开心色 | 国产综合在线视频 | 一边喂奶一边做边爱 | 亚洲国语在线视频手机在线 | 亚洲精品久久久午夜福利电影网 | 夜色福利院在线观看免费 | 91九色网址 | www.久久久| 好看的电影网站亚洲一区 | 亚洲福利电影一区二区? | 久久高清一级毛片 | 日韩一本在线 | 亚洲AV噜噜狠狠网址蜜桃尤物 | 国产自产第一区c国产 | 伦理片秋霞免费影院 | 亚洲AV成人片色在线观看网站 | 久久精品国产清白在天天线 | 欧美一级久久久久久久大 | 情浓野战台湾三级 | 99这里有精品视频视频 | 99re8久久热在线视频 | 欧美精品色婷婷五月综合 | 国产360激情盗摄全集 | 忘忧草在线社区WWW日本直播 | 久久国产欧美 | 青娱乐视觉盛宴国产视频 | 芳草地社区在线视频 | 亚洲国产日韩欧美在线a乱码 | 亚洲无遮挡无码A片在线 | 免费看大黄高清网站视频在线 | 佐山爱巨大肥臀在线 | 一本大道香蕉中文在线视频观看 | 草莓西瓜樱桃香蕉直播视频 |