具有未知深度值的递归函数。返回所有值(未定义的深度)

时间:2014-06-06 14:39:42

标签: php recursion depth

我有一个关于递归PHP函数的问题。 我有一个ID和一个函数数组,为给定的id返回一个“子id”的数组。

public function getChildId($id) {
    …
    //do some stuff in db
    …
    return childids;
}

一个孩子也可以有孩子! 现在,我希望有一个递归函数,收集所有的子项。

我有一个包含这样的ID的数组:

$myIds = array("1111“,"2222“,"3333“,“4444“,…);

和一个功能:

function getAll($myIds) {

}

我想要的:我想要一个数组,包含我阵列同一级别的所有id(包括未知级别的childids)。只要getChildId($ id)-function返回ID's ......

我开始使用我的功能:

function getAll($myIds) {
    $allIds = $myIds;
    foreach($myIds as $mId) {
        $childids = getChildId($mId);

        foreach($childids as $sId) {
            array_push($allIds, $sId);

            //here is my problem.
            //what do I have to do, to make this function rekursive to
            //search for all the childids? 

        }       
    }
    return $allIds;

}

我尝试了很多东西,但没有任何效果。你能救我吗?

2 个答案:

答案 0 :(得分:1)

假设您的示例中有一个平面数组,您只需要调用一个函数来检查每个数组元素以确定它是否是一个数组。如果是,则函数自己调用它,如果不是,则将数组元素追加到结果数组中。这是一个例子:

$foo = array(1,2,3,
  array(4,5,
    array(6,7,
      array(8,9,10)
    )
  ),
  11,12
);

$bar = array();
recurse($foo,$bar);

function recurse($a,&$bar){
  foreach($a as $e){
    if(is_array($e)){
      recurse($e,$bar);
    }else{
      $bar[] = $e;
    }
  }
}

var_dump($bar);

DEMO

答案 1 :(得分:0)

我认为这段代码可以解决问题

function getAll($myIds) {
    $allIds = Array();
    foreach($myIds as $mId) {
        array_push($allIds, $mId);
        $subids = getSubId($mId);

        foreach($subids as $sId) {
            $nestedIds = getAll($sId);
            $allIds = array_merge($allIds, $nestedIds);
        }       
    }
    return $allIds;
}