PHPが無制限極分類を実現する2つの方式の例【再帰と参照方式】

8251 ワード

本明細書では、PHPが無制限極分類を実現する2つの方法について説明する.面接の时に无限极分类の设计と実现を闻かれました.よくある方法は表を作る时に、PIDフィールドを増やして自分の所属する分类を区别することです.

$array = array(
array('id' => 1, 'pid' => 0, 'name' => '   '),
array('id' => 2, 'pid' => 0, 'name' => '   '),
array('id' => 3, 'pid' => 1, 'name' => '   '),
array('id' => 4, 'pid' => 2, 'name' => '   '),
array('id' => 5, 'pid' => 2, 'name' => '   '),
array('id' => 6, 'pid' => 4, 'name' => '  '),
array('id' => 7, 'pid' => 4, 'name' => '   '),
array('id' => 8, 'pid' => 3, 'name' => '   '),
array('id' => 9, 'pid' => 1, 'name' => '   '),
);


データがデータベースに格納されるのは大体このようにして、どのように無制限の再帰を実現しますか?
再帰アルゴリズム

/**
*          
* @param $array     
* @param $pid  ID
* @param $level     
* @return $list               $level        
*/
function getTree($array, $pid =0, $level = 0){
    //      ,       ,          
    static $list = [];
    foreach ($array as $key => $value){
      //     ,                pid=0   
      if ($value['pid'] == $pid){
        //          ,   0,      
        $value['level'] = $level;
        //     list 
        $list[] = $value;
        //           ,        
        unset($array[$key]);
        //    ,   ID    ID   ,       +1
        getTree($array, $value['id'], $level+1);
      }
    }
    return $list;
}
/*
*         ,      
*/
$array = getTree($array);
foreach($array) as $value{
    echo str_repeat('--', $value['level']), $value['name'].'
'; }

出力結果無制限極分類実現ok
河北省--邯鄲市---永年区--武安市北京市--朝陽区---望京---酒仙橋--通州区
リファレンスアルゴリズム

function generateTree($array){
  //        
  $items = array();
  foreach($array as $value){
    $items[$value['id']] = $value;
  }
  //               
  $tree = array();
  foreach($items as $key => $value){
    if(isset($items[$item['pid']])){
      $items[$item['pid']]['son'][] = &$items[$key];
    }else{
      $tree[] = &$items[$key];
    }
  }
  return $tree;
}
//             
Array
(
  [1] => Array
    (
      [id] => 1
      [pid] => 0
      [name] =>    
      [children] => Array
        (
        )
    )
  [2] => Array
    (
      [id] => 2
      [pid] => 0
      [name] =>    
      [children] => Array
        (
        )
    )
  [3] => Array
    (
      [id] => 3
      [pid] => 1
      [name] =>    
      [children] => Array
        (
        )
    )
  [4] => Array
    (
      [id] => 4
      [pid] => 2
      [name] =>    
      [children] => Array
        (
        )
    )
  [5] => Array
    (
      [id] => 5
      [pid] => 2
      [name] =>    
      [children] => Array
        (
        )
    )
  [6] => Array
    (
      [id] => 6
      [pid] => 4
      [name] =>   
      [children] => Array
        (
        )
    )
  [7] => Array
    (
      [id] => 7
      [pid] => 4
      [name] =>    
      [children] => Array
        (
        )
    )
  [8] => Array
    (
      [id] => 8
      [pid] => 3
      [name] =>    
      [children] => Array
        (
        )
    )
  [9] => Array
    (
      [id] => 9
      [pid] => 1
      [name] =>    
      [children] => Array
        (
        )
    )
)
//          ,      ,            
 $tree = array();
 //       
  foreach($items as $key => $value){
  //  pid      
    if(isset($items[$value['pid']])){
      //    $value  pid   son                  ?
      $items[$value['pid']]['son'][] = &$items[$key];
    }else{
      $tree[] = &$items[$key];
    }
  }
//           ,php              
//                                       tree                              !!!     tree                php                tree                      
//          ,tree                                 ,     
//          
 Array
(
  [0] => Array
    (
      [id] => 1
      [pid] => 0
      [name] =>    
    )
  [1] => Array
    (
      [id] => 2
      [pid] => 0
      [name] =>    
    )
)
//                                    1 2,  $tree     ,        ,                  $tree   ,                                             tree   
//               
Array
(
  [0] => Array
    (
      [id] => 1
      [pid] => 0
      [name] =>    
      [son] => Array
        (
          [0] => Array
            (
              [id] => 3
              [pid] => 1
              [name] =>    
            )
        )
    )
  [1] => Array
    (
      [id] => 2
      [pid] => 0
      [name] =>    
    )
)
//                                     
//          
Array
(
  [1] => Array
    (
      [id] => 1
      [pid] => 0
      [name] =>    
      [children] => Array
        (
          [0] => Array
            (
              [id] => 3
              [pid] => 1
              [name] =>    
              [children] => Array
                (
                  [0] => Array
                    (
                      [id] => 8
                      [pid] => 3
                      [name] =>    
                    )
                )
            )
          [1] => Array
            (
              [id] => 9
              [pid] => 1
              [name] =>    
            )
        )
    )
  [2] => Array
    (
      [id] => 2
      [pid] => 0
      [name] =>    
      [children] => Array
        (
          [0] => Array
            (
              [id] => 4
              [pid] => 2
              [name] =>    
              [children] => Array
                (
                  [0] => Array
                    (
                      [id] => 6
                      [pid] => 4
                      [name] =>   
                    )
                  [1] => Array
                    (
                      [id] => 7
                      [pid] => 4
                      [name] =>    
                    )
                )
            )
          [1] => Array
            (
              [id] => 5
              [pid] => 2
              [name] =>    
            )
        )
    )
)
//                          


PHPについてもっと兴味のある読者は、「PHPデータ构造とアルゴリズム教程」、「phpプログラム设计アルゴリズム総括」、「php文字列(string)用法総括」、「PHP配列(Array)操作技巧大全」、「PHP常用遍歴アルゴリズムと技巧総括」、「PHP数学演算技巧総括」
ここで述べたことが皆さんのPHPプログラム設計に役立つことを願っています.