无限极原理与 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号上将名字->上将->将官

废话不多说,上示例代码 和 图解

function GetParent_id($data,$pid){
    static $arr = [];
    foreach($data as $key => $value){
        if($value['id'] == $pid){
            $arr[] = $value;

            GetParent_id($data,$value['parant_id']);
        }
    }
    return $arr;
}

$arr_parant = GetParent_id($Military,7);
得出数据
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($data,$id){
    static $ids = [];
    if($id == 0){
        return error();
    }
foreach($data as $key => $value){
    if($id = $value['parant_id']){
        $ids[] = $value;

        getChlidId($data,$value['id']);
    }
}
return $ids;

}

$arr_child = getChlidId($Military,2)

得出数据

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号上将名字"
  }
}

本文为ctexthuang原创文章,转载请注明来自ctexthuang_blog

tag(s): none
show comments · back · home
Edit with Markdown
召唤看板娘