PHP unlimited classification tree data formatting code

高洛峰
Release: 2023-03-03 17:22:01
Original
1462 people have browsed it

We know that the infinite classification of many open source software uses recursive algorithms, but we know that recursion wastes time and space (memory).
Last time I also shared my own original infinite classification spanning tree method. An enthusiastic PHP master netizen gave me valuable suggestions. I tested it and found that the time of this code was very short. Reference: http://www.oschina.net/code/snippet_98719_11296. I sorted it out again and found that the database After querying the data, we have already determined the key value. Therefore, in practice, we usually query the model in the form of data formatted into the corresponding primary key value, so we can use such data directly, eliminating a layer of loops. . The code is also very concise.

Original code:

function genTree($items,$id='id',$pid='pid',$son = 'children'){
  $tree = array(); //格式化的树
  $tmpMap = array(); //临时扁平数据
    
  foreach ($items as $item) {
    $tmpMap[$item[$id]] = $item;
  }
    
  foreach ($items as $item) {
    if (isset($tmpMap[$item[$pid]])) {
      $tmpMap[$item[$pid]][$son][] = &$tmpMap[$item[$id]];
    } else {
      $tree[] = &$tmpMap[$item[$id]];
    }
  }
  unset($tmpMap);
  return $tree;
}
  
$items1 = array(
    array('id' => 1, 'pid' => 0, 'name' => '一级11' ),
    array('id' => 11, 'pid' => 0, 'name' => '一级12' ),
    array('id' => 2, 'pid' => 1, 'name' => '二级21' ),
    array('id' => 10, 'pid' => 11, 'name' => '二级22' ),
    array('id' => 3, 'pid' => 1, 'name' => '二级23' ),
    array('id' => 12, 'pid' => 11, 'name' => '二级24' ),
    array('id' => 9, 'pid' => 1, 'name' => '二级25' ),
    array('id' => 14, 'pid' => 1, 'name' => '二级26' ),
    array('id' => 4, 'pid' => 9, 'name' => '三级31' ),
    array('id' => 6, 'pid' => 9, 'name' => '三级32' ),
    array('id' => 7, 'pid' => 4, 'name' => '四级41' ),
    array('id' => 8, 'pid' => 4, 'name' => '四级42' ),
    array('id' => 5, 'pid' => 4, 'name' => '四级43' ),
    array('id' => 13, 'pid' => 4, 'name' => '四级44' ),
    array('id' => 15, 'pid' => 8, 'name' => '五级51' ),
    array('id' => 16, 'pid' => 8, 'name' => '五级52' ),
    array('id' => 17, 'pid' => 8, 'name' => '五级53' ),
    array('id' => 18, 'pid' => 16, 'name' => '六级64' ),
); 
var_dump(genTree($items1));
Copy after login

The following is the supplement:

/**
 * 此方法由@Tonton 提供
 * http://my.oschina.net/u/918697
 * @date 2012-12-12
 */
function genTree5($items) {
  foreach ($items as $item)
    $items[$item['pid']]['son'][$item['id']] = &$items[$item['id']];
  return isset($items[0]['son']) ? $items[0]['son'] : array();
}
Copy after login
/**
 * 将数据格式化成树形结构
 * @author Xuefen.Tong
 * @param array $items
 * @return array
 */
function genTree9($items) {
  $tree = array(); //格式化好的树
  foreach ($items as $item)
    if (isset($items[$item['pid']]))
      $items[$item['pid']]['son'][] = &$items[$item['id']];
    else
      $tree[] = &$items[$item['id']];
  return $tree;
}
  
$items = array(
  1 => array('id' => 1, 'pid' => 0, 'name' => '江西省'),
  2 => array('id' => 2, 'pid' => 0, 'name' => '黑龙江省'),
  3 => array('id' => 3, 'pid' => 1, 'name' => '南昌市'),
  4 => array('id' => 4, 'pid' => 2, 'name' => '哈尔滨市'),
  5 => array('id' => 5, 'pid' => 2, 'name' => '鸡西市'),
  6 => array('id' => 6, 'pid' => 4, 'name' => '香坊区'),
  7 => array('id' => 7, 'pid' => 4, 'name' => '南岗区'),
  8 => array('id' => 8, 'pid' => 6, 'name' => '和兴路'),
  9 => array('id' => 9, 'pid' => 7, 'name' => '西大直街'),
  10 => array('id' => 10, 'pid' => 8, 'name' => '东北林业大学'),
  11 => array('id' => 11, 'pid' => 9, 'name' => '哈尔滨工业大学'),
  12 => array('id' => 12, 'pid' => 8, 'name' => '哈尔滨师范大学'),
  13 => array('id' => 13, 'pid' => 1, 'name' => '赣州市'),
  14 => array('id' => 14, 'pid' => 13, 'name' => '赣县'),
  15 => array('id' => 15, 'pid' => 13, 'name' => '于都县'),
  16 => array('id' => 16, 'pid' => 14, 'name' => '茅店镇'),
  17 => array('id' => 17, 'pid' => 14, 'name' => '大田乡'),
  18 => array('id' => 18, 'pid' => 16, 'name' => '义源村'),
  19 => array('id' => 19, 'pid' => 16, 'name' => '上坝村'),
);
 
print_r(genTree5($items));
print_r(genTree9($items));
//后者输出格式,前者类似,只是数组键值不一样,不过不影响数据结构
 
/*
Array
(
[0] => Array
  (
    [id] => 1
    [pid] => 0
    [name] => 江西省
    [son] => Array
      (
        [0] => Array
          (
            [id] => 3
            [pid] => 1
            [name] => 南昌市
          )
  
        [1] => Array
          (
            [id] => 13
            [pid] => 1
            [name] => 赣州市
            [son] => Array
              (
                [0] => Array
                  (
                    [id] => 14
                    [pid] => 13
                    [name] => 赣县
                    [son] => Array
                      (
                      [0] => Array
                        (
                          [id] => 16
                          [pid] => 14
                          [name] => 茅店镇
                          [son] => Array
                            (
                            [0] => Array
                              (
                              [id] => 18
                              [pid] => 16
                              [name] => 义源村
                              )
  
                            [1] => Array
                              (
                              [id] => 19
                              [pid] => 16
                              [name] => 上坝村
                              )
  
                            )
  
                        )
  
                      [1] => Array
                        (
                          [id] => 17
                          [pid] => 14
                          [name] => 大田乡
                        )
  
                      )
  
                  )
  
                [1] => Array
                  (
                    [id] => 15
                    [pid] => 13
                    [name] => 于都县
                  )
  
              )
  
          )
  
      )
  
  )
  
[1] => Array
  (
    [id] => 2
    [pid] => 0
    [name] => 黑龙江省
    [son] => Array
      (
        [0] => Array
          (
            [id] => 4
            [pid] => 2
            [name] => 哈尔滨市
            [son] => Array
              (
              [0] => Array
                (
                  [id] => 6
                  [pid] => 4
                  [name] => 香坊区
                  [son] => Array
                    (
                    [0] => Array
                      (
                        [id] => 8
                        [pid] => 6
                        [name] => 和兴路
                        [son] => Array
                          (
                            [0] => Array
                              (
                              [id] => 10
                              [pid] => 8
                              [name] =>
                               东北林业大学
                              )
  
                            [1] => Array
                              (
                              [id] => 12
                              [pid] => 8
                              [name] =>
                              哈尔滨师范大学
                              )
  
                          )
  
                      )
  
                    )
  
                )
  
              [1] => Array
                (
                  [id] => 7
                  [pid] => 4
                  [name] => 南岗区
                  [son] => Array
                    (
                    [0] => Array
                      (
                      [id] => 9
                      [pid] => 7
                      [name] => 西大直街
                      [son] => Array
                        (
                        [0] => Array
                          (
                          [id] => 11
                          [pid] => 9
                          [name] =>
                           哈尔滨工业大学
                          )
  
                        )
  
                      )
  
                    )
  
                )
  
              )
  
          )
  
        [1] => Array
          (
            [id] => 5
            [pid] => 2
            [name] => 鸡西市
          )
  
      )
  
  )
)*/
Copy after login

Extremely simple and effective! ! ! Very useful!

For more PHP unlimited classification and tree data formatting code related articles, please pay attention to the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!