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

时间:2012-03-01 23:39:36

标签: php

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。不知道为什么它会在递归发生后反转输出。任何建议将不胜感激

2 个答案:

答案 0 :(得分:0)

如果不知道您的数据库结构,很难说这是否容易或可能,但您不需要递归来查找到根节点的树节点的路径 - 您可以使用自联接来执行此操作。此外,您应该避免在递归函数中进行查询。如果您可以描述表结构,我可以尝试向您展示如何按顺序获取树路径的结果集。

答案 1 :(得分:0)

你的代码的问题是它的传递当前的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分钟尝试了解你的问题。