php专区

 首页 > php专区 > PHP应用 > 常用功能 > PHP 查询多级分类的实例程序代码 - php高级应用

PHP 查询多级分类的实例程序代码 - php高级应用

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

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

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

  1. //查询 
  2.  
  3. $dsql->SetQuery("SELECT * FROM category ORDER BY sortorder ASC"); 
  4. $dsql->Execute('parentlist'); 
  5. $array = array(); 
  6. $parentlist = array(); 
  7. while ($rs=$dsql->getObject('parentlist')) 
  8.     if($rs->parentid == 0) 
  9.     { 
  10.         $parentlist[$rs->id] = (array)$rs
  11.     } 
  12.     else 
  13.     { 
  14.         $array[$rs->id] = (array)$rs
  15.     } 
  16. $parentlist = cat_options($parentlist$array);  //我们求的结果数组 
  17.  
  18. //$list父级分类的数组 
  19.  
  20. //$array是除父级分类外的全部分类的数组 
  21.  
  22. function cat_options(&$list,&$array
  23.     foreach ($list as $key => $arr
  24.     { 
  25.         foreach ($array as $k => $value
  26.         { 
  27.             if($value['parentid'] == $arr['id']) 
  28.             { 
  29.                 $list[$key]['children'][] = $value
  30.                 unset($array[$k]); 
  31.             } 
  32.         } 
  33.     } 
  34.     foreach ($list as $key => $arr
  35.     { 
  36.         if(is_array($arr['children']) && count($arr['children']) > 0) 
  37.         { 
  38.             $list[$key]['children'] = cat_options($list[$key]['children'], $array); 
  39.         } 
  40.     } 
  41.     return $list

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

  1. //模拟PHP无限分类查询结果     
  2. return array(     
  3. array(     
  4. ‘id’=>1,     
  5. ‘pid’=>0,     
  6. ‘name’=>‘主页’     
  7. ),     
  8. array(     
  9. ‘id’=>2,     
  10. ‘pid’=>0,     
  11. ‘name’=>‘新闻’     
  12. ),     
  13. array(     
  14. ‘id’=>3,     
  15. ‘pid’=>0,     
  16. ‘name’=>‘媒体’     
  17. ),     
  18. array(     
  19. ‘id’=>4,     
  20. ‘pid’=>0,     
  21. ‘name’=>‘下载’     
  22. ),     
  23. array(     
  24. ‘id’=>5,     
  25. ‘pid’=>0,     
  26. ‘name’=>‘关于我们’     
  27. ),     
  28. array(     
  29. ‘id’=>6,     
  30. ‘pid’=>2,     
  31. ‘name’=>‘天朝新闻’     
  32. ),     
  33. array(     
  34. ‘id’=>7,     
  35. ‘pid’=>2,     
  36. ‘name’=>‘海外新闻’     
  37. ),     
  38. array(     
  39. ‘id’=>8,     
  40. ‘pid’=>6,     
  41. ‘name’=>‘州官新闻’     
  42. ),     
  43. array(     
  44. ‘id’=>9,     
  45. ‘pid’=>3,     
  46. ‘name’=>‘音乐’     
  47. ),     
  48. array(     
  49. ‘id’=>10,     
  50. ‘pid’=>3,     
  51. ‘name’=>‘电影’     
  52. ),     
  53. array(     
  54. ‘id’=>11,     
  55. ‘pid’=>3,     
  56. ‘name’=>‘小说’     
  57. ),     
  58. array(     
  59. ‘id’=>12,     
  60. ‘pid’=>9,     
  61. ‘name’=>‘铃声’     
  62. ),     
  63. array(     
  64. ‘id’=>13,     
  65. ‘pid’=>9,     
  66. ‘name’=>‘流行音乐’     
  67. ),     
  68. array(     
  69. ‘id’=>14,     
  70. ‘pid’=>9,     
  71. ‘name’=>‘古典音乐’     
  72. ),     
  73. array(     
  74. ‘id’=>15,     
  75. ‘pid’=>12,     
  76. ‘name’=>‘热门铃声’     
  77. ),     
  78. array(     
  79. ‘id’=>16,     
  80. ‘pid’=>12,     
  81. ‘name’=>‘搞笑铃声’     
  82. ),     
  83. array(     
  84. ‘id’=>17,     
  85. ‘pid’=>12,     
  86. ‘name’=>‘MP3铃声’     
  87. ),     
  88. array(     
  89. ‘id’=>18,     
  90. ‘pid’=>17,     
  91. ‘name’=>‘128K’     
  92. ),     
  93. array(     
  94. ‘id’=>19,     
  95. ‘pid’=>8,     
  96. ‘name’=>‘娱乐新闻’     
  97. ),     
  98. array(     
  99. ‘id’=>20,     
  100. ‘pid’=>11,     
  101. ‘name’=>‘穿越类’     
  102. ),     
  103. array(     
  104. ‘id’=>21,     
  105. ‘pid’=>11,     
  106. ‘name’=>‘武侠类’     
  107. ),     
  108. );     
  109. ?> 

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

  1.           
  2. /**     
  3.           
  4. * Tree 树型类(无限分类)     
  5.          
  6.  
  7.           
  8. * @version 1.0     
  9.           
  10. * @access public      
  11. * @example      
  12. *   $tree= new Tree($result);     
  13.           
  14. *   $arr=$tree->leaf(0);     
  15.           
  16. *   $nav=$tree->navi(15);     
  17.           
  18. */ 
  19.           
  20. class Tree {     
  21.           
  22.         private $result;     
  23.           
  24.         private $tmp;     
  25.           
  26.         private $arr;     
  27.           
  28.         private $already = array();     
  29.           
  30.         /**     
  31.           
  32.          * 构造函数     
  33.           
  34.          *      
  35.          * @param array $result 树型数据表结果集     
  36.           
  37.          * @param array $fields 树型数据表字段,array(分类id,父id)     
  38.           
  39.          * @param integer $root 顶级分类的父id     
  40.           
  41.          */ 
  42.           
  43.         public function __construct($result$fields = array('id''pid'), $root = 0) {     
  44.           
  45.                 $this->result = $result;     
  46.           
  47.                 $this->fields = $fields;     
  48.           
  49.                 $this->root = $root;     
  50.           
  51.                 $this->handler();     
  52.           
  53.         }     
  54.           
  55.         /**     
  56.           
  57.          * 树型数据表结果集处理     
  58.           
  59.          */ 
  60.           
  61.         private function handler() {     
  62.           
  63.                 foreach ($this->result as $node) {     
  64.           
  65.                         $tmp[$node[$this->fields[1]]][] = $node;     
  66.           
  67.                 }     
  68.           
  69.                 krsort($tmp);     
  70.           
  71.                 for ($i = count($tmp); $i > 0; $i--) {     
  72.           
  73.                         foreach ($tmp as $k => $v) {     
  74.           
  75.                                 if (!in_array($k$this->already)) {     
  76.           
  77.                                         if (!$this->tmp) {     
  78.           
  79.                                                 $this->tmp = array($k$v);    
  80.           
  81.                                                 $this->already[] = $k;     
  82.           
  83.                                                 continue;     
  84.           
  85.                                         } else {     
  86.           
  87.                                                 foreach ($v as $key => $value) {     
  88.           
  89.                                                         if ($value[$this->fields[0]] == $this->tmp[0]) {     
  90.           
  91.                                                                 $tmp[$k][$key]['child'] = $this->tmp[1];     
  92.           
  93.                                                                 $this->tmp = array($k$tmp[$k]);     
  94.           
  95.                                                         }     
  96.           
  97.                                                 }     
  98.           
  99.                                         }     
  100.           
  101.                                 }     
  102.           
  103.                         }     
  104.           
  105.                         $this->tmp = null;     
  106.           
  107.                 }     
  108.           
  109.                 $this->tmp = $tmp;     
  110.           
  111.         }     
  112.           
  113.         /**     
  114.           
  115.          * 反向递归     
  116.           
  117.          */ 
  118.           
  119.         private function recur_n($arr$id) {     
  120.           
  121.                 foreach ($arr as $v) {     
  122.           
  123.                         if ($v[$this->fields[0]] == $id) {     
  124.           
  125.                                 $this->arr[] = $v;     
  126.           
  127.                                 if ($v[$this->fields[1]] != $this->root) $this->recur_n($arr$v[$this->fields[1]]);     
  128.           
  129.                         }     
  130.           
  131.                 }     
  132.           
  133.         }     
  134.           
  135.         /**     
  136.           
  137.          * 正向递归     
  138.           
  139.          */ 
  140.           
  141.         private function recur_p($arr) {     
  142.           
  143.                 foreach ($arr as $v) {     
  144.           
  145.                         $this->arr[] = $v[$this->fields[0]];     
  146.           
  147.                         if ($v['child']) $this->recur_p($v['child']);     
  148.           
  149.                 }     
  150.           
  151.         }     
  152.           
  153.         /**     
  154.           
  155.          * 菜单 多维数组     
  156.           
  157.          *      
  158.          * @param integer $id 分类id     
  159.           
  160.          * @return array 返回分支,默认返回整个树     
  161.           
  162.          */ 
  163.           
  164.         public function leaf($id = null) {     
  165.           
  166.                 $id = ($id == null) ? $this->root : $id;     
  167.           
  168.                 return $this->tmp[$id];     
  169.           
  170.         }     
  171.           
  172.         /**     
  173.           
  174.          * 导航 一维数组     
  175.           
  176.          *      
  177.          * @param integer $id 分类id     
  178.           
  179.          * @return array 返回单线分类直到顶级分类     
  180.           
  181.          */ 
  182.           
  183.         public function navi($id) {     
  184.           
  185.                 $this->arr = null;     
  186.           
  187.                 $this->recur_n($this->result, $id);     
  188.           
  189.                 krsort($this->arr);     
  190.           
  191.                 return $this->arr;     
  192.           
  193.         }     
  194.           
  195.         /**     
  196.           
  197.          * 散落 一维数组     
  198.           
  199.          *      
  200.          * @param integer $id 分类id     
  201.           
  202.          * @return array 返回leaf下所有分类id     
  203.           
  204.          */ 
  205.           
  206.         public function leafid($id) {     
  207.           
  208.                 $this->arr = null;     
  209.           
  210.                 $this->arr[] = $id;     
  211.           
  212.                 $this->recur_p($this->leaf($id));     
  213.           
  214.                 return $this->arr;     
  215.           
  216.         }     
  217.           
  218. }     
  219.           
  220. ?> 
分享到:
PHP即时实时输出内容的程序代码 - php高...
PHP即时实时输出内容的程序代码 实时输出如果放在js中我们可以直接使用settimeout来守时输入很方便,但是如果在php中实现起来就不能这样了,下面我来给介绍利用 ob_flush() 和 flush()函数实现即时实时输出内容. 一般情况下,PHP都是将整个页面全部执行完成后,才会把要输出的内容发送回客户端,...
php+ajax实时获取下拉数据程序代码 - php...
php+ajax实时获取下拉数据程序代码 你点击需要的数据后,这个数据写如到当前输入框,并在后面添加逗号隔开,继续输入的时候,后台处理继续输出数据以供选择. 下面我们来看实例,html代码如下:    ajax实时获取下拉数据                  //   var funjiel...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……