PHP使用递归取父类,反向递归一波

//数据不大的情况下,最好一次性查出来,在内存里递归,避免循环查表
$items = array(
    1 => array('id' => 1, 'pid' => 0, 'name' => '江西省','level'=>0),
    12 => array('id' => 12, 'pid' => 1, 'name' => '赣州市','level'=>1),
    13 => array('id' => 13, 'pid' => 12, 'name' => '赣州','level'=>2),
    14 => array('id' => 14, 'pid' => 13, 'name' => '赣县','level'=>3),

 
);
//将数据id提到前面作为key,可以节省if条件
$ids = array_column($items, null,'id');

function test($ids,$id,$level){
    //静态数组,防止数据丢失
    static $list = [];
    //当前值的id和父id,判断父id为0,中止循环
    if($level == 0){
        return false;
    }   
    //存储父类名字和id,自己根据业务需求来
    $pid = $ids[$id]['pid'];
    $list[$level]['name'] = $ids[$pid]['name'];
    $list[$level]['id'] = $ids[$pid]['id'];
    //调用自己,一直到level小于0停止
    test($ids,$ids[$id]['pid'],--$level);
    return $list;
}
//假设我们的id为14,根据上面的数组可以得到当前id的level
$id = 14;
var_dump(test($ids,$id,$ids[$id]['level']));exit;

输出结果

array(3) {
  [3] =>
  array(2) {
    'name' =>
    string(6) "赣州"
    'id' =>
    int(13)
  }
  [2] =>
  array(2) {
    'name' =>
    string(9) "赣州市"
    'id' =>
    int(12)
  }
  [1] =>
  array(2) {
    'name' =>
    string(9) "江西省"
    'id' =>
    int(1)
  }
}

时间复杂度是O(n),避免了循环查表,后期优化可以将数据放入缓存

打赏作者

发表评论

电子邮件地址不会被公开。