无限极原理与 PHP 递归代码实现
首先来谈谈我对无限极的看法,就是对数据的多层级分类,如同参天大树一般,从主干,到枝干,再到叶子。 无限极实现的方法。主要有两种,一是递归,二是迭代。无限极一般有两种方式,一是往上查找,二是往下查找。
1.往上查找(族谱树)从某个节点开始向上寻找其父节点,再找父节点的父节点,直到找不到为止。按照这种寻找,形成的一个类似树状的结构,就叫做族谱树。2.往下查找(子孙树)与族谱树相反,从某个节点开始往下寻找其子节点,再找子节点的子节点,直到找不到为止。这样形成的树状结构,就叫做子孙树。
递归方式
1.往上查找我们先来一组数据
$Military = [
0 => [
'id' => 1,
'parant_id' => 0,
'heading' => '司令'
],
1 => [
'id' => 2,
'parant_id' => 0,
'heading' => '将官'
],
2 => [
'id' => 3,
'parant_id' => 1,
'heading' => '司令人名'
],
3 => [
'id' => 4,
'parant_id' => 0,
'heading' => '校官'
],
4 => [
'id' => 5,
'parant_id' => 2,
'heading' => '上将'
],
5 => [
'id' => 6,
'parant_id' => 4,
'heading' => '中校'
],
6 => [
'id' => 7,
'parant_id' => 5,
'heading' => '1号上将名字'
],
7 => [
'id' => 8,
'parant_id' => 4,
'heading' => '下校'
],
8 => [
'id' => 9,
'parant_id' => 6,
'heading' => '1号中校名字'
],
9 => [
'id' => 10,
'parant_id' => 7,
'heading' => '2号上将名字'
]
];
按照上文的介绍,对上面数据进行族谱树无限极分类,假设我们想要寻找1号上将名字
的族谱,先找到该条数据。
'id'=>7,'parent_id'=>5,'heading'=>'1号上将名字'
可以看出它的父节点的id,即parent_id = 5
,那么id = 5
的节点就是其父节点,由此找到上将:
'id' => 5,'parant_id' => 2,'heading' => '上将'
与上面类似,寻找id=2
的节点,依次向上寻找,找到1号上将名字
的族谱:
1号上将名字->上将->将官
废话不多说,上示例代码 和 图解</blockquote>
function GetParent_id(pid){
static data as key =>value){
if(pid){
value; GetParent_id($data,$value['parant_id']);
}
}
return $arr;
}
Military,7);</code></pre>
得出数据
array(3) {
[0]=>
array(3) {
["id"]=>
int(7)
["parant_id"]=>
int(5)
["heading"]=>
string(16) "1号上将名字"
}
[1]=>
array(3) {
["id"]=>
int(5)
["parant_id"]=>
int(2)
["heading"]=>
string(6) "上将"
}
[2]=>
array(3) {
["id"]=>
int(2)
["parant_id"]=>
int(0)
["heading"]=>
string(6) "将官"
}
}
2.往下查找 同样直接上代码
function getChlidId(id){
static id == 0){
return error();
}foreach($data as $key => $value){
if($id = $value['parant_id']){
$ids[] = $value;
getChlidId($data,$value['id']);
}
}
return $ids;
}
Military,2)</code</pre> 得出数据
array(3) { [0]=> array(3) { ["id"]=> int(5) ["parant_id"]=> int(2) ["heading"]=> string(6) "上将" } [1]=> array(3) { ["id"]=> int(7) ["parant_id"]=> int(5) ["heading"]=> string(16) "1号上将名字" } [2]=> array(3) { ["id"]=> int(10) ["parant_id"]=> int(7) ["heading"]=> string(16) "2号上将名字" } }