欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP無限分類(樹形類)

 更新時(shí)間:2013年09月28日 22:17:59   作者:  
PHP無限分類,Google一下就能找到很多相關(guān)資料,思路比較拉風(fēng)的,也是用得比較多的就是分類表至少有id,pid,name三個(gè)字段,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)去了。也就是別人要用你這個(gè)類,還要跟你建一樣的表,真TM惡心。由于項(xiàng)目要用到,所以自己寫了一個(gè)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)返回整個(gè)樹
     */
    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無限分類的使用方法:

復(fù)制代碼 代碼如下:

$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>

轉(zhuǎn)載請申明來自kvoid.com

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

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

相關(guān)文章

  • php之可變變量的實(shí)例詳解

    php之可變變量的實(shí)例詳解

    這篇文章主要介紹了php之可變變量的實(shí)例詳解的相關(guān)資料,希望通過本文大家能夠掌握php 可變變量的使用方法,需要的朋友可以參考下
    2017-09-09
  • PHP關(guān)鍵特性之命名空間實(shí)例詳解

    PHP關(guān)鍵特性之命名空間實(shí)例詳解

    命名空間主要是為了解決代碼中類和函數(shù)可能存在沖突的問題。這篇文章給大家介紹php關(guān)鍵特性之命名空間,包括命名空間的定義等知識點(diǎn),需要的朋友參考下吧
    2017-05-05
  • 使用PHP?Smarty處理表單數(shù)據(jù)的方法

    使用PHP?Smarty處理表單數(shù)據(jù)的方法

    這篇文章主要介紹了如何使用PHP?Smarty處理表單數(shù)據(jù),首先需要下載Smarty庫并將其解壓到你的項(xiàng)目,下面通過本文結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • PHP GC回收機(jī)制實(shí)例詳解

    PHP GC回收機(jī)制實(shí)例詳解

    GC的全稱是Garbage Collection也就是垃圾回收的意思,在PHP中,是使用引用計(jì)數(shù)和回收周期來自動(dòng)管理內(nèi)存對象的,當(dāng)一個(gè)對象被設(shè)置為NULL,或者沒有任何指針指向時(shí),他就會(huì)變成垃圾,被GC機(jī)制回收掉,這篇文章主要介紹了PHP GC回收機(jī)制詳解 ,需要的朋友可以參考下
    2024-01-01
  • 為PHP模塊添加SQL SERVER2012數(shù)據(jù)庫的步驟詳解

    為PHP模塊添加SQL SERVER2012數(shù)據(jù)庫的步驟詳解

    這篇文章主要介紹了為PHP模塊添加SQL SERVER2012數(shù)據(jù)庫,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • VPS中使用LNMP安裝WordPress教程

    VPS中使用LNMP安裝WordPress教程

    這篇文章主要介紹了VPS中使用LNMP安裝WordPress教程,需要的朋友可以參考下
    2014-12-12
  • smarty中常用方法實(shí)例總結(jié)

    smarty中常用方法實(shí)例總結(jié)

    這篇文章主要介紹了smarty中常用方法,較為詳細(xì)的分析了smarty模板中較為常用的方法、屬性及環(huán)境變量等使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • 如何利用微信小程序和php實(shí)現(xiàn)即時(shí)通訊聊天功能

    如何利用微信小程序和php實(shí)現(xiàn)即時(shí)通訊聊天功能

    微信小程序是現(xiàn)在應(yīng)用比較廣的流量平臺(tái)之一,當(dāng)小程序的流量越來越多時(shí),就需要在小程序中接入即時(shí)通信聊天功能來實(shí)現(xiàn)更好的流量變現(xiàn)轉(zhuǎn)化,下面這篇文章主要給大家介紹了關(guān)于如何利用微信小程序和php實(shí)現(xiàn)即時(shí)通訊聊天功能的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • gd庫圖片下載類實(shí)現(xiàn)下載網(wǎng)頁所有圖片的php代碼

    gd庫圖片下載類實(shí)現(xiàn)下載網(wǎng)頁所有圖片的php代碼

    在前期的php教程就講了php gd庫可以實(shí)現(xiàn)遠(yuǎn)程圖片的下載,但是那只是下載了一張圖片,原理是一樣的,要想下載一個(gè)網(wǎng)頁的所有圖片只要使用正則表達(dá)式進(jìn)行判斷,找出所有的圖片url就可以進(jìn)行循環(huán)下載了,我特地參照網(wǎng)絡(luò)資源編寫了gd庫圖片下載類!
    2012-08-08
  • yii 框架實(shí)現(xiàn)按天,月,年,自定義時(shí)間段統(tǒng)計(jì)數(shù)據(jù)的方法分析

    yii 框架實(shí)現(xiàn)按天,月,年,自定義時(shí)間段統(tǒng)計(jì)數(shù)據(jù)的方法分析

    這篇文章主要介紹了yii 框架實(shí)現(xiàn)按天,月,年,自定義時(shí)間段統(tǒng)計(jì)數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了yii基于自定義時(shí)間段統(tǒng)計(jì)數(shù)據(jù)的相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2020-04-04

最新評論