0

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

由于我使用的是 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 数组中的元素不匹配。谢谢!

4

1 回答 1

3

你需要:

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

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

于 2012-04-25T10:25:34.740 回答