递归函数说它做了一件事,实际上做了另一件事?

时间:2012-04-25 10:20:15

标签: php recursion

我的问题:从动物家谱数据库中检索特定母亲的后代。

我的解决方案,因为我正在使用mySQL,是为了获得所有可能的候选者,然后在PHP中使用递归函数。

不考虑我正在使用的数据库模型是否设计得很好的重要问题,是否有更优雅的方法来检索数据,或者递归函数本身是否特别有效,我想要一些见解为什么我提出的解决方案不是很有效。当我在各个地方回应输出时,它说它正在回归正确的孩子;但实际回报并不对应。

因此,我的sql只返回与其母ID匹配的所有子ID,然后构建一个数组,其中子项是键,母项是值。关于数据有些奇怪的可能性,我决定使用返回的确切结果对数组进行硬编码:

$aData = array("1"=>"20", "14"=>"12", "15"=>"14", "16"=>"10", "20"=>"13", "23"=>"20", "46"=>"20", "39"=>"12", "43"=>"13", "44"=>"13", "54"=>"1", "49"=>"1", "113"=>"46", "112"=>"54", "130"=>"15", "131"=>"43");

递归函数:

// $targetMom is the mother whose descendants I want
// $targetChild is each possible candidate
// $childID is initially the same as $targetChild
function recurseTree($data, $childID, $targetMom, $row, $targetChild){
    $momID = isset($data[$childID]) ? $data[$childID] : -1 ; 
    //echo "row: " . $row . " id: " . $childID . " mom ID: " . $momID . " target: ". $targetMom . " final target: ". $targetChild . "<br />"; 

    if ($momID == $targetMom){
        echo $momID . "==" . $targetMom . "; returning target: ". $targetChild . "<br/><br/>";
        return $targetChild;                
    } else if ($row == sizeof($data)) { // reached the end of the data array - no more to check
        //echo "row: " . $row . "== size of array: " . sizeof($data) . "<br />";
        return -1;
    } else if ($momID == -1) { // this child doesn't have a mom defined
        //echo "momID == -1<br />";
        return -1;
    } else {
        //echo 'recursing<br/>';
        recurseTree($data, $momID, $targetMom, ++$row, $targetChild);
    }               
}

最后,调用递归函数,现在我只对ID为12的特定母亲感兴趣:

$children = array();
foreach( $aData as $k=> $v){
    $return = recurseTree($aData, $k, 12, 0, $k);
    if ($return != -1 && $return != null) {
        $children[] = $return;
    }
}

所以,只要查看recurseTree()里面的echo语句的输出,就会发现它返回了四个值:

12==12; returning target: 14
12==12; returning target: 15
12==12; returning target: 39
12==12; returning target: 130

然而,回显构建的实际数组只显示了两个值:

Array
(
    [0] => 14
    [1] => 39
)

随意发布有关改进代码的任何提示,但我最感兴趣的是为什么echo语句与$ children数组中的元素不匹配。谢谢!

1 个答案:

答案 0 :(得分:3)

你需要:

return recurseTree($data, $momID, $targetMom, ++$row, $targetChild);

否则,内部迭代获得的值永远不会返回到外部范围。