PHP 查询多级分类的实例程序代码
发布:smiling 来源: PHP粉丝网 添加日期:2014-07-23 09:11:55 浏览: 评论:0
分类表,比如category,字段有 id,parentid,title,查询时,我们希望得到有层级关系的数组,就是顶级是顶级分类,然后每个分类中有个children子数组,记录它的子分类,这样一级一级的分级数组,代码如下:
- //查询
- $dsql->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;
- }
好了现在给大家推荐一个无限分类的函数,代码如下:
- <?php
- //模拟PHP无限分类查询结果
- 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’=>‘关于我们’
- ),
- 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’=>‘武侠类’
- ),
- );
- ?>
无限分类函数,代码如下:
- <?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('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;
- }
- }
- ?>
Tags: PHP多级分类 实例程序
- 上一篇:php+ajax实时获取下拉数据程序代码
- 下一篇:PHP即时实时输出内容的程序代码
相关文章
- ·php备份mysql实例程序(2014-09-10)

推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)