[英]How can i fix the output of this recursion function
function my_recurse($id,$tree=array())
{
$hols = array();
$overall = array();
$asd = $this->db->get_where('story', array('story_id'=>$id))->row_array();
if(isset($asd['story_id'])){
$preds = explode(',',$asd['story_pred']);
if($preds[0] != 0)
{
$hols[] = $preds[0];
$hols = array_merge($tree, $hols);
$this->my_recurse($preds[0],$hols);
}
}
print_r($hols);
}
例如说我有这棵树
story1 NULL story2 story1 story3 story2 story4 story3
当我在函数中输入story4作为我的id时,它总是返回story3,而不是story1,story2和story3。 不知道为什么递归发生后它会反转输出。 任何建议,将不胜感激
在不知道数据库结构的情况下很难说这是简单还是可行,但是您无需递归即可找到树节点到根的路径-您可以使用自连接来实现。 另外,您应该避免在递归函数中进行查询。 如果您可以描述表结构,那么我可以尝试向您展示如何获得顺序为树路径的结果集。
您的代码的问题在于,它将当前的pred 传递给父对象,从而传递了反向树。 相反,它应该是从父母那里得到的东西
如果我清楚地了解您的要求,这应该可以工作
<?php
function my_recurse($id) {
$hols = array();
$overall = array();
$asd = getFromDB($id);
if(isset($asd['story_id'])){
$preds = explode(',',$asd['story_pred']);
if($preds[0] != 0) {
$hols[] = $preds[0];
$hols = array_merge(my_recurse($preds[0]), $hols);
} else {
return $hols;
}
print "preds of {$id} : ";
print implode(', ', $hols) . "\n";
return $hols;
}
}
function getFromDB($id) {
$data = array(1 => array('story_id'=>1, 'story_pred' => '0'),
2 => array('story_id'=>2, 'story_pred' => '1'),
3 => array('story_id'=>3, 'story_pred' => '2'),
4 => array('story_id'=>4, 'story_pred' => '3'),
);
return $data[$id];
}
my_recurse(4);
运行上面的脚本。
$ /usr/bin/php recurse.php
preds of 2 : 1
preds of 3 : 1, 2
preds of 4 : 1, 2, 3
PS:请添加示例输入,输出和预期输出。 我花了15分钟才能尝试了解您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.