ホームページ > php教程 > php手册 > PHP 查询多级分类的实例程序代码

PHP 查询多级分类的实例程序代码

WBOY
リリース: 2016-05-25 16:43:56
オリジナル
1085 人が閲覧しました

分类表,比如category,字段有 id,parentid,title,查询时,我们希望得到有层级关系的数组,就是顶级是顶级分类,然后每个分类中有个children子数组,记录它的子分类,这样一级一级的分级数组,代码如下:

<?php
//查询
$dsql->SetQuery("SELECT * FROM category ORDER BY sortorder ASC");
$dsql->Execute(&#39;parentlist&#39;);
$array = array();
$parentlist = array();
while ($rs = $dsql->getObject(&#39;parentlist&#39;)) {
    if ($rs->parentid == 0) {
        $parentlist[$rs->id] = (array)$rs;
    } else {
        $array[$rs->id] = (array)$rs;
    }
}
$parentlist = cat_options($parentlist, $array); //我们求的结果数组
//$list父级分类的数组
//$array是除父级分类外的全部分类的数组
function cat_options(&$list, &$array) {
    foreach ($list as $key => $arr) {
        foreach ($array as $k => $value) {
            if ($value[&#39;parentid&#39;] == $arr[&#39;id&#39;]) {
                $list[$key][&#39;children&#39;][] = $value;
                unset($array[$k]);
            }
        }
    }
    foreach ($list as $key => $arr) {
        if (is_array($arr[&#39;children&#39;]) && count($arr[&#39;children&#39;]) > 0) {
            $list[$key][&#39;children&#39;] = cat_options($list[$key][&#39;children&#39;], $array);
        }
    }
    return $list;
}
?>
ログイン後にコピー

好了现在给大家推荐一个无限分类的函数,代码如下:

<?php
//模拟PHP无限分类查询结果
return array(
    array(
        &#39;id&#39; => 1,
        &#39;pid&#39; => 0,
        &#39;name&#39; => &#39;主页&#39;
    ) ,
    array(
        &#39;id&#39; => 2,
        &#39;pid&#39; => 0,
        &#39;name&#39; => &#39;新闻&#39;
    ) ,
    array(
        &#39;id&#39; => 3,
        &#39;pid&#39; => 0,
        &#39;name&#39; => &#39;媒体&#39;
    ) ,
    array(
        &#39;id&#39; => 4,
        &#39;pid&#39; => 0,
        &#39;name&#39; => &#39;下载&#39;
    ) ,
    array(
        &#39;id&#39; => 5,
        &#39;pid&#39; => 0,
        &#39;name&#39; => &#39;关于我们&#39;
    ) ,
    array(
        &#39;id&#39; => 6,
        &#39;pid&#39; => 2,
        &#39;name&#39; => &#39;天朝新闻&#39;
    ) ,
    array(
        &#39;id&#39; => 7,
        &#39;pid&#39; => 2,
        &#39;name&#39; => &#39;海外新闻&#39;
    ) ,
    array(
        &#39;id&#39; => 8,
        &#39;pid&#39; => 6,
        &#39;name&#39; => &#39;州官新闻&#39;
    ) ,
    array(
        &#39;id&#39; => 9,
        &#39;pid&#39; => 3,
        &#39;name&#39; => &#39;音乐&#39;
    ) ,
    array(
        &#39;id&#39; => 10,
        &#39;pid&#39; => 3,
        &#39;name&#39; => &#39;电影&#39;
    ) ,
    array(
        &#39;id&#39; => 11,
        &#39;pid&#39; => 3,
        &#39;name&#39; => &#39;小说&#39;
    ) ,
    array(
        &#39;id&#39; => 12,
        &#39;pid&#39; => 9,
        &#39;name&#39; => &#39;铃声&#39;
    ) ,
    array(
        &#39;id&#39; => 13,
        &#39;pid&#39; => 9,
        &#39;name&#39; => &#39;流行音乐&#39;
    ) ,
    array(
        &#39;id&#39; => 14,
        &#39;pid&#39; => 9,
        &#39;name&#39; => &#39;古典音乐&#39;
    ) ,
    array(
        &#39;id&#39; => 15,
        &#39;pid&#39; => 12,
        &#39;name&#39; => &#39;热门铃声&#39;
    ) ,
    array(
        &#39;id&#39; => 16,
        &#39;pid&#39; => 12,
        &#39;name&#39; => &#39;搞笑铃声&#39;
    ) ,
    array(
        &#39;id&#39; => 17,
        &#39;pid&#39; => 12,
        &#39;name&#39; => &#39;MP3铃声&#39;
    ) ,
    array(
        &#39;id&#39; => 18,
        &#39;pid&#39; => 17,
        &#39;name&#39; => &#39;128K&#39;
    ) ,
    array(
        &#39;id&#39; => 19,
        &#39;pid&#39; => 8,
        &#39;name&#39; => &#39;娱乐新闻&#39;
    ) ,
    array(
        &#39;id&#39; => 20,
        &#39;pid&#39; => 11,
        &#39;name&#39; => &#39;穿越类&#39;
    ) ,
    array(
        &#39;id&#39; => 21,
        &#39;pid&#39; => 11,
        &#39;name&#39; => &#39;武侠类&#39;
    ) ,
);
?>
ログイン後にコピー

无限分类函数,代码如下:

<?php
/**     
 * Tree 树型类(无限分类)
 * @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(
        &#39;id&#39;,
        &#39;pid&#39;
    ) , $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][&#39;child&#39;] = $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[&#39;child&#39;]) $this->recur_p($v[&#39;child&#39;]);
        }
    }
    /**     
     * 菜单 多维数组
     *
     * @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;
    }
}
?>
ログイン後にコピー


本文地址:

转载随意,但请附上文章地址:-)

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート