• 分享一个牛逼的PHP无限极分类生成树方法,巧用引用


    你还在用浪费时间又浪费内存的递归遍历无限极分类吗,看了该篇文章,我觉得你应该换换了。
    这是我在OSChina上看到的一段非常精简的PHP无限极分类生成树方法,巧在引用,整理分享了。

    1. function generateTree($items){
    2. $tree = array();
    3. foreach($items as $item){
    4. if(isset($items[$item['pid']])){
    5. $items[$item['pid']]['son'][] = &$items[$item['id']];
    6. }else{
    7. $tree[] = &$items[$item['id']];
    8. }
    9. }
    10. return $tree;
    11. }
    12. $items = array(
    13. 1 => array('id' => 1, 'pid' => 0, 'name' => '安徽省'),
    14. 2 => array('id' => 2, 'pid' => 0, 'name' => '浙江省'),
    15. 3 => array('id' => 3, 'pid' => 1, 'name' => '合肥市'),
    16. 4 => array('id' => 4, 'pid' => 3, 'name' => '长丰县'),
    17. 5 => array('id' => 5, 'pid' => 1, 'name' => '安庆市'),
    18. );
    19. print_r(generateTree($items));


    可以看到下面打印的结果:

    1. Array
    2. (
    3. [0] => Array
    4. (
    5. [id] => 1
    6. [pid] => 0
    7. [name] => 安徽省
    8. [son] => Array
    9. (
    10. [0] => Array
    11. (
    12. [id] => 3
    13. [pid] => 1
    14. [name] => 合肥市
    15. [son] => Array
    16. (
    17. [0] => Array
    18. (
    19. [id] => 4
    20. [pid] => 3
    21. [name] => 长丰县
    22. )
    23.  
    24. )
    25.  
    26. )
    27.  
    28. [1] => Array
    29. (
    30. [id] => 5
    31. [pid] => 1
    32. [name] => 安庆市
    33. )
    34.  
    35. )
    36.  
    37. )
    38.  
    39. [1] => Array
    40. (
    41. [id] => 2
    42. [pid] => 0
    43. [name] => 浙江省
    44. )
    45.  
    46. )


    上面生成树方法还可以精简到5行:

    1. function generateTree($items){
    2. foreach($items as $item)
    3. $items[$item['pid']]['son'][$item['id']] = &$items[$item['id']];
    4. return isset($items[0]['son']) ? $items[0]['son'] : array();
    5. }


    上面这种无限极分类数据树形结构化的方法值得借鉴。但是我觉得这段代码实际用途并不明显啊,你想取出格式化的树形数据还是要递归啊:

      1. /**
      2. * 如何取数据格式化的树形数据
      3. * @blog<http://www.phpddt.com>
      4. */
      5. $tree = generateTree($items);
      6. function getTreeData($tree){
      7. foreach($tree as $t){
      8. echo $t['name'].'<br>';
      9. if(isset($t['son'])){
      10. getTreeData($t['son']);
      11. }
      12. }
      13. }
      14. getTreeData($tree);
  • 相关阅读:
    Northwind数据库下载地址
    MSSQL跨服务访问数据库
    MSSQL基于一致性的I/O错误,解决方法之一
    DataGridView单元格ComboBox控件添加事件
    线程安全类 跨线程修改窗体UI
    数据库字段名
    SELECT INTO 和 INSERT INTO SELECT
    链表
    因为数据库正在使用,所以无法获得对数据库的独占访问权
    代替游标的循环
  • 原文地址:https://www.cnblogs.com/student-programmer/p/6738522.html
Copyright © 2020-2023  润新知