溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何編寫PHP無限分類

發(fā)布時(shí)間:2021-10-09 09:56:03 來源:億速云 閱讀:131 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“如何編寫PHP無限分類”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何編寫PHP無限分類”吧!

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

<?php
//模擬PHP無限分類查詢結(jié)果
return array(
    array(
        'id'=>1,
        'pid'=>0,
        'name'=>'主頁(yè)'
    ),
    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)挫,直接把對(duì)數(shù)據(jù)庫(kù)操作也封裝進(jìn)去了。也就是別人要用你這個(gè)類,還要跟你建一樣的表,真TM惡心。由于項(xiàng)目要用到,所以自己寫了一個(gè)PHP無限分類的類(也稱樹形類),沒有數(shù)據(jù)庫(kù)的操作,只需要實(shí)例化的時(shí)候傳進(jìn)去結(jié)果集,也就是樹形數(shù)組。再執(zhí)行l(wèi)eaf方法或navi方法即可得到想要的結(jié)果,下面請(qǐng)看源碼,看完之后奉上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 頂級(jí)分類的父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 返回單線分類直到頂級(jí)分類
     */
    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)載請(qǐng)申明來自kvoid.com

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

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

到此,相信大家對(duì)“如何編寫PHP無限分類”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI