我的问题:从动物家谱数据库中检索特定母亲的后代。
我的解决方案,因为我正在使用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数组中的元素不匹配。谢谢!
答案 0 :(得分:3)
你需要:
return recurseTree($data, $momID, $targetMom, ++$row, $targetChild);
否则,内部迭代获得的值永远不会返回到外部范围。