• php无限分类三种方式


      1 <?php
      2 header('content-type:text/html;charset=utf-8');
      3 
      4 /**
      5  * 无限分类 方式一
      6  * 字段 id path name
      7  * 通过添加父类到子类的路径的一个字符串来判断,数据库中常用,通过concat查询排序
      8  * 输出时通过排序得出结果
      9  */
     10 $arr1 = array(
     11     array('id' => 1, 'path' => '0', 'name' => '中国'),
     12     array('id' => 2, 'path' => '0', 'name' => '美国'),
     13     array('id' => 3, 'path' => '0', 'name' => '英国'),
     14     array('id' => 4, 'path' => '0-1', 'name' => '北京市'),
     15     array('id' => 5, 'path' => '0-1', 'name' => '上海市'),
     16     array('id' => 6, 'path' => '0-1', 'name' => '天津市'),
     17     array('id' => 7, 'path' => '0-1-4', 'name' => '东城区'),
     18     array('id' => 8, 'path' => '0-1-4', 'name' => '西城区'),
     19     array('id' => 9, 'path' => '0-1-5', 'name' => '黄浦区'),
     20     array('id' => 10, 'path' => '0-1-5', 'name' => '普陀区'),
     21     array('id' => 11, 'path' => '0-1-5-9', 'name' => '南京西路'),
     22     array('id' => 12, 'path' => '0-1-5-9-11', 'name' => '人民公园'),
     23     array('id' => 13, 'path' => '0-1-5-10', 'name' => '真北路'),
     24     array('id' => 14, 'path' => '0-1-5-10-13', 'name' => '上海番茄研究院')
     25 );
     26 
     27 //主要合并path和id并排序,最后安装path长度加空格以便区分
     28 function gettree1($arr) {
     29     foreach ($arr as $k => $v) {
     30         $arr[$k]['path'] = $arr[$k]['path'].'-'.$arr[$k]['id'];
     31     }
     32     usort($arr, 'gettree1_usort');
     33     return $arr;
     34 }
     35 
     36 function gettree1_usort($a, $b) {
     37     return strcmp($a['path'], $b['path']);
     38 }
     39 
     40 echo 'arr1:<br/>';
     41 echo '<select>';
     42 
     43 foreach (gettree1($arr1) as $k => $v) {
     44     echo '<option>'.str_repeat('&nbsp;&nbsp;&nbsp;', count(explode('-', $v['path']))-2).$v['name'].'</option>';
     45 }
     46 echo '</select>';
     47 
     48 /**
     49  * 无限分类 方式二
     50  * 字段 id pid name
     51  * 通过递归转化树形数组
     52  * 可通过递归输出树形数组
     53  */
     54 $arr2 = array(
     55     array('id' => 1, 'pid' => '0', 'name' => '中国'),
     56     array('id' => 2, 'pid' => '0', 'name' => '美国'),
     57     array('id' => 3, 'pid' => '0', 'name' => '英国'),
     58     array('id' => 4, 'pid' => '1', 'name' => '北京市'),
     59     array('id' => 5, 'pid' => '1', 'name' => '上海市'),
     60     array('id' => 6, 'pid' => '1', 'name' => '天津市'),
     61     array('id' => 7, 'pid' => '4', 'name' => '东城区'),
     62     array('id' => 8, 'pid' => '4', 'name' => '西城区'),
     63     array('id' => 9, 'pid' => '5', 'name' => '黄浦区'),
     64     array('id' => 10, 'pid' => '5', 'name' => '普陀区'),
     65     array('id' => 11, 'pid' => '9', 'name' => '南京西路'),
     66     array('id' => 12, 'pid' => '11', 'name' => '人民公园'),
     67     array('id' => 13, 'pid' => '10', 'name' => '真北路'),
     68     array('id' => 14, 'pid' => '13', 'name' => '上海番茄研究院')
     69 );
     70 
     71 //获得树形数组
     72 function gettree2($arr, $pid = 0) {
     73     $tree = array();
     74     foreach ($arr as $k => $v) {
     75         if ($v['pid'] == $pid) {
     76             $tree[] = $v;
     77         }
     78     }
     79     if (empty($tree)) {
     80         return null;
     81     }
     82     foreach ($tree as $k => $v) {
     83         $tree[$k]['son'] = gettree2($arr, $v['id']);
     84     }
     85     return $tree;
     86 }
     87 
     88 echo '<br/>arr2:<br/>';
     89 echo '<select>';
     90 inputtree(gettree2($arr2));
     91 echo '</select>';
     92 
     93 /**
     94  * 无限分类 方式三
     95  * 字段 id pid name
     96  * 非递归通过引用传值转化树形数组,此种情况pid必须与子数组索引有对应关系,才可以使用,一般不使用
     97  * 可通过递归输出树形数组
     98  */
     99 $arr3 = array(
    100     array('id' => 1, 'pid' => '0', 'name' => '中国'),
    101     array('id' => 2, 'pid' => '0', 'name' => '美国'),
    102     array('id' => 3, 'pid' => '0', 'name' => '英国'),
    103     array('id' => 4, 'pid' => '1', 'name' => '北京市'),
    104     array('id' => 5, 'pid' => '1', 'name' => '上海市'),
    105     array('id' => 6, 'pid' => '1', 'name' => '天津市'),
    106     array('id' => 7, 'pid' => '4', 'name' => '东城区'),
    107     array('id' => 8, 'pid' => '4', 'name' => '西城区'),
    108     array('id' => 9, 'pid' => '5', 'name' => '黄浦区'),
    109     array('id' => 10, 'pid' => '5', 'name' => '普陀区'),
    110     array('id' => 11, 'pid' => '9', 'name' => '南京西路'),
    111     array('id' => 12, 'pid' => '11', 'name' => '人民公园'),
    112     array('id' => 13, 'pid' => '10', 'name' => '真北路'),
    113     array('id' => 14, 'pid' => '13', 'name' => '上海番茄研究院')
    114 );
    115 
    116 //获得树形数组
    117 function gettree3($items, $pid = 0) {
    118     $r = array();
    119     foreach ($items as $k => $item) {
    120         if ($item['pid'] == $pid) {
    121             $r[] = &$items[$k];
    122         } else {
    123             $items[$item['pid']-1]['son'][] = &$items[$k]; //可根据关系修改[$item['pid']-1]
    124         }
    125     }
    126     return isset($r) ? $r : array();
    127 }
    128 
    129 echo '<br/>arr3:<br/>';
    130 echo '<select>';
    131 inputtree(gettree3($arr3));
    132 echo '</select>';
    133 
    134 
    135 /**
    136  * 输出树形数组 字段 id pid name
    137  * @param $arr array 要输出的数组
    138  * @param $num int 输出文字前的空格倍数
    139  */
    140 function inputtree($arr, $num = 0) {
    141     static $i;
    142     $i = $num;
    143     foreach ($arr as $v) {
    144         if (isset($v['son'])) {
    145             echo '<option>'.str_repeat('&nbsp;&nbsp;&nbsp;', $i++).$v['name'].'</option>';
    146             inputtree($v['son'], $i);
    147         } else {
    148             echo '<option>'.str_repeat('&nbsp;&nbsp;&nbsp;', $i).$v['name'].'</option>';
    149         }
    150     }
    151     $i--;
    152 }
    153 
    154 
    155 ?>
  • 相关阅读:
    超详细mysql left join,right join,inner join用法分析
    sql FOR XML PATH
    sql server 使用for xml path 将1列多行转换为字符串连接起来,俗称 sql 合并字符
    菜鸟疑问之新建网站与新建web应用程序区别
    asp.net常用函数表
    屌丝逆袭--Asp.net快速入门学习教程 第1晚
    MongoDB学习记录(一)
    Git的SSH-key生成、导入及使用
    atom编辑器使用“apm install”无法响应的解决方案
    Knockout.js组件系统的详解之(一)
  • 原文地址:https://www.cnblogs.com/caps/p/2943761.html
Copyright © 2020-2023  润新知