我有一个函数 - 基于父子id - 从数据库中检索结果。父子结构最多可以包含四个“级别”的层次结构,并且基于给定的方案,应该从给定级别检索最深层次的结果。
我有这个功能:
static public function ThisFunction($iParentId, $aResult) {
$aRows = ClassName::GetAllByParentId($iParentId);
for($i = 0; $i < count($aRows); $i++) {
$oRow = $aRows[$i];
if($oRow->Level != 'deepest_level') {
return ClassName::ThisFunction($oRow->Id, $aResult);
} else {
$aResult[] = $oRow;
}
}
return $aResult;
}
在我的框架中,数据库调用(在本例中为ClassName是Model_TableName)是静态的。 ThisFunction指的是 - 正如你所看到的,这个函数。
结果是循环结果,但是当第一个$ aRows迭代'deepest_level'处理了来自该父级的所有行时,该函数停止。我的期望是该函数将返回其递归调用并一直处理其他数据。
我是否在这个懒惰的星期天监督着什么? 提前谢谢。
修改 我已经尝试了这些建议,但我仍然坚持我最初的问题。假设我有这个样本数据集:
id parent id level value
-----------------------------
1 0 highest AAA
2 1 middle BBB
3 1 middle CCC
4 2 deepest DDD
5 3 deepest EEE
6 0 highest FFF
此数据集的级别较少,但仅用于演示。
当我在寻找最深的价值时,我期待得到DDD
和EEE
。就我而言,我只得到DDD
。当我尝试合并结果时......
答案 0 :(得分:6)
如果级别不是最深,则立即从递归调用返回,并且不处理循环中的其他元素。
我猜你的意思是:
$aResult[] = ClassName::ThisFunction($oRow->Id, $aResult);
或类似的东西......从你的问题来看,它无法分辨出结果应该如何。
答案 1 :(得分:3)
您永远不会合并嵌套调用的结果,只需返回它们即可。尝试更改
return ClassName::ThisFunction($oRow->Id, $aResult);
到
$aResult = array_merge($aResult, ClassName::ThisFunction($oRow->Id, $aResult));
答案 2 :(得分:2)
也许您想收集递归调用的结果?
$aResult[] = ClassName::ThisFunction($oRow->Id, $aResult);