繁体   English   中英

如何修复此递归函数的输出

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM