PHPが無制限極分類を実現する2つの方式の例【再帰と参照方式】
8251 ワード
本明細書では、PHPが無制限極分類を実現する2つの方法について説明する.面接の时に无限极分类の设计と実现を闻かれました.よくある方法は表を作る时に、PIDフィールドを増やして自分の所属する分类を区别することです.
データがデータベースに格納されるのは大体このようにして、どのように無制限の再帰を実現しますか?
再帰アルゴリズム
出力結果無制限極分類実現ok
河北省--邯鄲市---永年区--武安市北京市--朝陽区---望京---酒仙橋--通州区
リファレンスアルゴリズム
PHPについてもっと兴味のある読者は、「PHPデータ构造とアルゴリズム教程」、「phpプログラム设计アルゴリズム総括」、「php文字列(string)用法総括」、「PHP配列(Array)操作技巧大全」、「PHP常用遍歴アルゴリズムと技巧総括」、「PHP数学演算技巧総括」
ここで述べたことが皆さんのPHPプログラム設計に役立つことを願っています.
$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プログラム設計に役立つことを願っています.