【问题标题】:Recursive function when data-structure of argument varies?参数的数据结构变化时的递归函数?
【发布时间】:2012-09-09 20:30:31
【问题描述】:

对不起,如果标题令人困惑,但我正在尝试使用递归函数获取所有 cmets 及其回复。问题是顶级评论对象具有与 cmets 不同的数据结构。从$comment_object->data->children 访问顶级cmets,而从$comment->data->replies 访问所有评论回复。这是我目前所拥有的:

public function get_top_comments()
{
    $comments_object = json_decode(file_get_contents("http://www.reddit.com/comments/$this->id.json"));
    sleep(2); // after every page request

    $top_comments = array();
    foreach ($comments_object[1]->data->children as $comment)
    {
        $c = new Comment($comment->data);
        $top_comments[] = $c;
    }
    return $top_comments;
}

public function get_comments($comments = $this->get_top_comments) //<-- doesn't work
{
    //var_dump($comments);

    foreach ($comments as $comment)
    {
        if ($comment->data->replies != '')
        {
            //Recursive call
        }
    }
}

我尝试将$comments = $this-&gt;get_top_comments 指定为递归函数的默认参数,但我猜PHP 不支持这个?我是否必须在函数中使用 if-else 块来分隔不同的结构?

【问题讨论】:

    标签: php recursion overloading reddit


    【解决方案1】:

    我将get_comments() 的默认值设置为NULL,然后检查它是否为空;如果是,请使用顶级 cmets。无论如何,您都不希望传递的 cmets 为 NULL

    public function get_comments($comments = NULL)
    {
        //var_dump($comments);
    
        if (is_null($comments))
            $comments = $this->get_top_comments;
    
        foreach ($comments as $comment)
        {
            if ($comment->data->replies != '')
            {
                //Recursive call
            }
        }
    }
    

    the PHP docs 中的一个示例就是这样做的。请注意文档中的这条评论:

    默认值必须是常量表达式,而不是(例如)变量、类成员或函数调用。

    【讨论】:

    • 感谢您解决这个问题,这解释了我收到的错误 T-variable expected
    猜你喜欢
    • 2018-08-27
    • 2016-03-18
    • 2014-07-06
    • 2018-03-25
    • 1970-01-01
    • 2020-05-16
    • 2010-11-04
    • 1970-01-01
    • 2017-10-02
    相关资源
    最近更新 更多