这样的数组,如何通过下级的id,递归来获取所有的上级信息

$all=[
        ['id'=>1,'pid'=>0,'title'=>'上海公司'],
        ['id'=>2,'pid'=>1,'title'=>'经理'],
        ['id'=>3,'pid'=>2,'title'=>'主管'],
        ['id'=>4,'pid'=>0,'title'=>'北京公司'],
        ['id'=>5,'pid'=>4,'title'=>'经理'],
        ['id'=>6,'pid'=>5,'title'=>'主管'],
    ];
    
function getInfo($id,$all){
    //如何通过下级的ID,递归来获取上级的所有信息?
}

getInfo(3);
getInfo(6);

数组如上
getInfo(3);
getInfo(6);
如何通过下级的ID,递归来获取上级的所有信息?
是否还有不通过递归的方式可以快速获取的?

阅读 4.5k
5 个回答

for(var i in $all){

if($id == $all[i][0]){
    //具体内容
    return $all[i][1]
    //或者
    return $all[i][2]
}

}
// 这样递归有什么问题吗?
为什么不能使用递归呢?

可以先对 $all 数组先做一下预处理

$all=[
    ['id'=>1,'pid'=>0,'title'=>'上海公司'],
    ['id'=>2,'pid'=>1,'title'=>'经理'],
    ['id'=>3,'pid'=>2,'title'=>'主管'],
    ['id'=>4,'pid'=>0,'title'=>'北京公司'],
    ['id'=>5,'pid'=>4,'title'=>'经理'],
    ['id'=>6,'pid'=>5,'title'=>'主管'],
];

function index($array, $key)
{
    $result = [];

    foreach ($array as $element) {
        if (isset($element[$key]) && $element[$key]) {
            $value = $element[$key];

            $result[$value] = $element;
        }

    }
    return $result;
}

$all = index($all, 'id');

function getInfo($id,$all){
    return isset($all[$id]) ? $all[$id] : null;
}

$a = getInfo(3, $all);
$b = getInfo(6, $all);

var_dump($a);
var_dump($b);
<?php
$all=[
    ['id'=>1,'pid'=>0,'title'=>'上海公司'],
    ['id'=>2,'pid'=>1,'title'=>'经理'],
    ['id'=>3,'pid'=>2,'title'=>'主管'],
    ['id'=>4,'pid'=>0,'title'=>'北京公司'],
    ['id'=>5,'pid'=>4,'title'=>'经理'],
    ['id'=>6,'pid'=>5,'title'=>'主管'],
];
function getInfo($id,$all){
    $all = array_combine(array_column($all, 'id'), $all);
    $data = [];
    $one = ['pid'=>$id];
    while(isset($all[$one['pid']]) and $one = $all[$one['pid']]){
        $data[] = $one;
    }
    return $data;
}
$a = getInfo(3,$all);
var_dump($a);
$all=[
    ['id'=>1,'pid'=>0,'title'=>'上海公司'],
    ['id'=>2,'pid'=>1,'title'=>'经理'],
    ['id'=>3,'pid'=>2,'title'=>'主管'],
    ['id'=>4,'pid'=>0,'title'=>'北京公司'],
    ['id'=>5,'pid'=>4,'title'=>'经理'],
    ['id'=>6,'pid'=>5,'title'=>'主管'],
];

function getInfo($id,$all){
    $all = array_combine(array_column($all, 'id'), $all);
    if(!isset($all[$all[$id]['pid']])) {
        return array();
    }
    return $all[$all[$id]['pid']];
}

你都知道id了,这还不简单了。

递归就是调用自身,那么就要有个递归终点,这个问题里就是id为0。

还有个问题,返回的数据要用什么格式,你没有说明,那我就用数组了,第一个元素是查找的元素,第二个是父元素,第三个是父元素的父元素,以此类推。

function getInfo($id, $all) {
  $result = [];

  if($id != 0) {  //将id等于0作为递归终点,如果要将无法查找到作为递归终点,也要在下面的循环遍历之后判断
    foreach($all as $item) {
      if($item['id']==$id) {
        $result[] = $item;
        break;
      }
    }

    $parents=getInfo($result[0]['pid'], $all);
    if(!empty($parents) {
      $result = array_merge($result, $parents);
    }
  }

  return $result;
}
推荐问题