欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

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

程序员文章站 2022-05-08 19:30:50
...
分类表,比如category,字段有 id,parentid,title,查询时,我们希望得到有层级关系的数组,就是*是*分类,然后每个分类中有个children子数组,记录它的子分类,这样一级一级的分级数组,代码如下:
SetQuery("SELECT * FROM category ORDER BY sortorder ASC");
$dsql->Execute('parentlist');
$array = array();
$parentlist = array();
while ($rs = $dsql->getObject('parentlist')) {
    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['parentid'] == $arr['id']) {
                $list[$key]['children'][] = $value;
                unset($array[$k]);
            }
        }
    }
    foreach ($list as $key => $arr) {
        if (is_array($arr['children']) && count($arr['children']) > 0) {
            $list[$key]['children'] = cat_options($list[$key]['children'], $array);
        }
    }
    return $list;
}
?>

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

 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' => '武侠类'
    ) ,
);
?>

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

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;
    }
}
?>


本文地址:

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