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

PHP無限分類(樹形類)

復制代碼 代碼如下:
<?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>

轉載請申明來自kvoid.com

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

對了,建議使用Smarty強大的緩存功能,緩存才是王道。

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

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

主站蜘蛛池模板: 久久精品视在线观看2 | 正在播放国产精品 | bl高h肉文 | 在教室伦流澡到高潮HNP视频 | 日本妞欧洲 | 99久久免热在线观看6 | 亚洲视频国产在线精品 | 亚洲成人免费在线观看 | 国产av免费观看日本 | 香蕉鱼视频观看在线视频下载 | 日本高清不卡码无码v亚洲 日本福利片午夜免费观着 日本粉嫩学生毛绒绒 | 翁止熄痒禁伦短文合集免费视频 | 国产成人午夜精品免费视频 | 老湿影院色情a | 俄罗斯bbbb | 专干老肥熟女视频网站300部 | 在线播放免费人成毛片视频 | 天天爽夜夜爽夜夜爽 | 四虎永久精品视频在线 | 99国产精品欲AV蜜桃臀麻豆 | 中文字幕视频在线免费观看 | 猫咪www958ii| 色姣姣狠狠撩综合网 | 6 10young俄罗斯 | 果冻传媒在线观看进入窗口 | 免费观看男生桶美女私人部位 | 含羞草免费完整视频在线观看 | 无人区国产片 | 亚洲日韩中文字幕日本有码 | 高H高肉强J短篇NP | 精彩国产萝视频在线 | 日韩人妻无码精品-专区 | 黄色天堂网站 | 国产精品97久久AV色婷婷 | 精品视频久久久久 | 揉抓捏打抽插射免费视频 | 中文字幕国产在线观看 | 中文字幕亚洲乱码熟女在线 | 91久久99久91天天拍拍 | 麻豆免费观看高清完整视频在线 | 国产午夜精品AV一区二区麻豆 |