PHP函数中的递归函数:如何防止返回值?

时间:2015-06-09 07:32:04

标签: php function recursion return return-value

我正在开发一个API来获取数据,就像其他标准API一样,它限制了项目的返回数量,例如:在我的情况下,每个页面只返回1个项目。所以,我必须得到

  1. total_count,
  2. page_size(在我的情况下是1),
  3. 和current_page_number。
  4. 问题是,无论我将其设置为递归,仍会在第一个周期返回值。例如如果总共有3个项目,并且每页限制为1个项目,则它将在第1个循环期间返回该值。

    为什么以及如何解决这个问题?

    非常感谢

    nvp< T > make_nvp(const char * name, T & t){
        return nvp< T >(name, t);
    }
    

2 个答案:

答案 0 :(得分:1)

您没有将递归回调的返回值分配回$ filter_video,请更改为:

if ($total_count > $page_size * $page_number) {
    $filter_video = get_video_list($page_number, $filter_video);
}

或者,甚至更好:通过引用传递。这样就完全不需要返回值,尤其适用于递归函数(函数声明中的notice&amp; $ filter_video,请参阅http://php.net/manual/en/language.references.pass.php)。

function get_video_list($page_no = 0, &$filter_video = array()) {
    $api = "http://api.brightcove.com/services/library?command=search_videos&page_size=1&video_fields=id%2Cname%2CcreationDate%2CFLVURL%2CpublishedDate%2ClinkURL%2CthumbnailURL%2Clength&media_delivery=http&sort_by=CREATION_DATE%3AASC&page_number=$page_no&get_item_count=true&token=" . READ_TOKEN;

    try {
        $ch = curl_init();

        if (FALSE === $ch) {
            throw new Exception('failed to initialize');
        }

        curl_setopt($ch, CURLOPT_URL, $api);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        $content = curl_exec($ch);

        if (FALSE === $content) {
            throw new Exception(curl_error($ch), curl_errno($ch));
        }

        $video_list = json_decode($content, false, 512, JSON_BIGINT_AS_STRING);

        $page_number = ($video_list->page_number) + 1; //start at 0
        $page_size = $video_list->page_size;
        $total_count = $video_list->total_count;

        foreach ($video_list->items as $video) {
            if (in_array($video->id, $stored_video)) {
                $filter_video [] = $video;
            }
        }

        if ($total_count > $page_size * $page_number) {
            get_video_list($page_number, $filter_video);
        }
    } catch (Exception $e) {
        trigger_error(sprintf('Curl failed with error #%d: %s', $e->getCode(), $e->getMessage()), E_USER_ERROR);
    }
}

然后这样称呼:

$myVideoList = [];
get_video_list(0, $myVideoList);

// Do stuff with $myVideoList

答案 1 :(得分:0)

这可以解决您的问题。

if ($total_count > $page_size * $page_number) {
      return get_video_list($page_number, $filter_video);
}