PHP 查询多级分类的实例程序代码
分类表,比如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);
-
-
-
-
-
- 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
-
- 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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- class Tree {
-
- private $result;
-
- private $tmp;
-
- private $arr;
-
- private $already = array();
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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']);
-
- }
-
- }
-
-
-
-
-
-
-
-
-
-
-
-
- public function leaf($id = null) {
-
- $id = ($id == null) ? $this->root : $id;
-
- return $this->tmp[$id];
-
- }
-
-
-
-
-
-
-
-
-
-
-
-
- public function navi($id) {
-
- $this->arr = null;
-
- $this->recur_n($this->result, $id);
-
- krsort($this->arr);
-
- return $this->arr;
-
- }
-
-
-
-
-
-
-
-
-
-
-
-
- public function leafid($id) {
-
- $this->arr = null;
-
- $this->arr[] = $id;
-
- $this->recur_p($this->leaf($id));
-
- return $this->arr;
-
- }
-
- }
-
- ?>
|