一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

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

php無限分類,Google一下就能找到很多相關(guān)資料,思路比較拉風(fēng)的,也是用得比較多的就是分類表至少有id,pid,name三個字段,id自增表分類,pid為父分類,name為分類名,這樣就構(gòu)成了一棵樹,如下,算是我查詢分類表得到的結(jié)果集。
復(fù)制代碼 代碼如下:
<?php
//模擬php無限分類查詢結(jié)果
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'=>'關(guān)于我們'
    ),
    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'=>'武俠類'
    ),
);
?>

拉風(fēng)歸拉風(fēng),但是那些文章提供的無限分類的類相關(guān)操作有點(diǎn)挫,直接把對數(shù)據(jù)庫操作也封裝進(jìn)去了。也就是別人要用你這個類,還要跟你建一樣的表,真TM惡心。由于項(xiàng)目要用到,所以自己寫了一個php無限分類的類(也稱樹形類),沒有數(shù)據(jù)庫的操作,只需要實(shí)例化的時(shí)候傳進(jìn)去結(jié)果集,也就是樹形數(shù)組。再執(zhí)行l(wèi)eaf方法或navi方法即可得到想要的結(jié)果,下面請看源碼,看完之后奉上smarty模板引擎的相應(yīng)的模板遞歸方法。
復(fù)制代碼 代碼如下:
<?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();
    /**
     * 構(gòu)造函數(shù)
     *
     * @param array $result 樹型數(shù)據(jù)表結(jié)果集
     * @param array $fields 樹型數(shù)據(jù)表字段,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();
    }
    /**
     * 樹型數(shù)據(jù)表結(jié)果集處理
     */
    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']);
        }
    }
    /**
     * 菜單 多維數(shù)組
     *
     * @param integer $id 分類id
     * @return array 返回分支,默認(rèn)返回整個樹
     */
    public function leaf($id = null) {
        $id = ($id == null) ? $this->root : $id;
        return $this->tmp[$id];
    }
    /**
     * 導(dǎo)航 一維數(shù)組
     *
     * @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;
    }
    /**
     * 散落 一維數(shù)組
     *
     * @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(……);//這里查詢得到結(jié)果集,注意結(jié)果集為數(shù)組
$tree= new Tree($result);
$arr=$tree->leaf(0);
$nav=$tree->navi(15);
$smarty->assign(‘a(chǎn)rr',$arr);
$smarty->assign(‘nav',$nav);
$smarty->display(‘test.html');
在smarty模板中這樣遞歸:
復(fù)制代碼 代碼如下:
<!--導(dǎo)航-->
<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>

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

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

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 欧美亚洲激情在线 | 成人国产在线24小时播放视频 | 国产第一页在线播放 | 国产精品玖玖玖在线观看 | 久久精品国产2020观看福利色 | 欧美综合视频 | 在线亚洲精品国产成人二区 | 91麻豆精品国产剧情 | 国产欧美激情一区二区三区 | 亚洲综合一区二区三区四区 | 精品久久中文网址 | 一区二区亚洲视频 | 欧美变态老妇重口与另类 | 91蜜桃传媒一二三区 | 伊人影院在线观看视频 | 亚洲午夜视频在线 | 国产精品伦理久久久久久 | 欧美午夜色大片在线观看免费 | 国产美女免费视频 | 9丨精品国产高清自在线看 aⅴ一区二区三区 | 在线视频观看国产 | 香港三级午夜理伦三级99 | 国产系列 视频二区 | 日日噜噜夜夜狠狠tv视频免费 | 国产精品极品美女自在线 | 伊人狠狠色j香婷婷综合 | 亚洲天堂岛国片 | 久久免费精品 | 欧美三级成人 | 久久免费公开视频 | 精品久久久久久久久久 | 99精品视频在线观看免费 | 男人的天堂久久精品激情a 男人进去女人爽免费视频国产 | 色中色官网 | 国产视频成人 | 香蕉成人国产精品免费看网站 | 成年美女黄网站色大片免费软件看 | 天天色图片 | 五月亭亭六月丁香 | 日本大片免a费观看视频+播放器 | 四虎影视国产在线观看精品 |