首頁 > 後端開發 > php教程 > 如何提高php無限分類查詢的效率(使用陣列和遞歸)

如何提高php無限分類查詢的效率(使用陣列和遞歸)

PHP中文网
發布: 2023-02-28 20:48:02
原創
1291 人瀏覽過

如何提高php無限分類查詢的效率(使用數組遞歸遞歸

<?php
class Tree {
    /**
     * 从数据库查询出的所有分类信息
     * @var array
     * by:bbs.it-home.org
     */
    var $arr;
    /**
     * 如下格式
     * var $arr = array(
     1 => array(‘id’=>’1′,’parentid’=>0,’name’=>’一级栏目一’),
     2 => array(‘id’=>’2′,’parentid’=>0,’name’=>’一级栏目二’),
     3 => array(‘id’=>’3′,’parentid’=>1,’name’=>’二级栏目一’),
     );*/
    /**
     * 输出结构
     * @var array
     */
    var $tree = array();
    /**
     * 树形递归的深度
     * @var int
     */
    var $deep = 1;
    /**
     * 生成树形的修饰符号
     * @var array
     */
    var $icon = array(&#39;│&#39;,&#39;├&#39;,&#39;└&#39;);
    /**
     * 生成指定id的下级树形结构
     * @param int $rootid 要获取树形结构的id
     * @param string $add 递归中使用的前缀
     * @param bool $parent_end 标识上级分类是否是最后一个
     */
    function getTree($rootid = 0,$add = "",$parent_end =true){
        $is_top = 1;
        $child_arr = $this->getChild($rootid);
        if(is_array($child_arr)){
            $cnt = count($child_arr);
            foreach($child_arr as $key => $child){
                $cid = $child[&#39;id&#39;];
                $child_child = $this->getChild($cid);
                if($this->deep >1){
                    if($is_top == 1 && $this->deep > 1){
                        $space = $this->icon[1];
                        if(!$parent_end)
                        $add .= $this->icon[0];
                        else $add .= "";
                    }
                    if($is_top == $cnt){
                        $space = $this->icon[2];
                        $parent_end = true;
                    }else {
                        $space = $this->icon[1];
                        $parent_end = false;
                    }
                }
                $this->tree[] = array(‘spacer’=>$add.$k.$space,
                ‘name’=>$child[&#39;name&#39;],
                ‘id’=>$cid
                );
                $is_top++;
                $this->deep++;
                if($this->getChild($cid))
                $this->getTree($cid,$add,$parent_end);
                $this->deep–;
            }
        }
        return $this->tree;
    }
    /**
     * 获取下级分类数组
     * @param int $root
     */
    function getChild($root = 0){
        $a = $child = array();
        foreach($this->arr as $id=>$a){
            if($a[&#39;parentid&#39;] == $root){
                $child[$a[&#39;id&#39;]] = $a;
            }
        }
        return $child?$child:false;
    }
    /**
     * 设置源数组
     * @param $arr
     */
    function setArr($arr = array()){
        $this->arr = $arr;
    }
}
?>
登入後複製

透過一次查詢把結構保存進一個數組,再數組進行遞歸運算,無疑極大的提高了程式運作效率。 程式碼的使用很簡單:得到查詢結構後setArr,直接呼叫getTree, 皆可以得到依照程式排序號碼並有前綴修飾等資訊的陣列。透過foreach這個陣列可以得到如下的樹狀列表: 水果├香蕉├蘋果│├紅富士│└海南蘋果└桃子記住:網站開發過程中,多數的瓶頸在資料庫,而非php程式碼


 以上就是如何提高php無限分類查詢的效率(使用數組和遞歸)的內容,更多相關內容請關注PHP中文網(m.sbmmt.com)!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板