1月 27, 2022 - php开发, 循环遍历    递归循环转为while循环已关闭评论

递归循环转为while循环

1:对youtube的分页数据,递归调用,以获取所有数据:

/**

     * getVideoIds 从youtube获取videoids

     * @date     2021-05-22 19:43

     * @param YoutubeRepositoryInterface $youtubeRepository

     * @param                            $oauth

     * @param                            $params

     * @param int                        $video_count

     * @return array

     */

private function getVideoIds(YoutubeRepositoryInterface $youtubeRepository,$oauth,$params,$video_count=0)

    {

        $videoIdsArr = [];

        static $number = 0;

        $method = $params['method'];

        $itemsResponse = $youtubeRepository->$method($oauth,$params['part'],$params['params']);

        if ($itemsResponse && isset($itemsResponse->items)) {

            foreach($itemsResponse->items as $video) {

                $snippet = $video->snippet;

                if ($params['source_type_channel']) {

                    $videoId = $video->id->videoId;

                } else {

                    $videoId = $snippet->resourceId->videoId;

                    if ($this->start_time && $this->start_time) {

                        $publish_at = Carbon::parse($snippet->publishedAt)->timestamp;

                        if ($publish_at > $this->end_time || $publish_at < $this->start_time) {

                            continue;

                        }

                    }

                }

                $videoIdsArr[] = $videoId;

                $number = $number + 1;

                if ($video_count && ($number >= $video_count)) {

                    $number = 0;

                    break;

                }

            }

        }

        // 循环获取分页的数据

        if ($number && $itemsResponse && $itemsResponse->nextPageToken) {

            $params['params']['pageToken'] = $itemsResponse->nextPageToken;

            $videoIdsArr = array_merge($videoIdsArr,$this->getVideoIds($youtubeRepository,$oauth,$params,$video_count));

        } else {

            unset($params['params']['pageToken']);

            $number = 0;

        }

        return $videoIdsArr;

    }

2:将上面的递归循环转换为while循环

/**

     * getVideoIds 从youtube获取videoids

     * @date     2021-05-22 19:43

     * @param YoutubeRepositoryInterface $youtubeRepository

     * @param                            $oauth

     * @param                            $params

     * @param int                        $video_count

     * @return array

     */

    private function getVideoIds(YoutubeRepositoryInterface $youtubeRepository,$oauth,$params,$video_count=0)

    {

        $videoIdsArr = [];

        $number = 0;

        $flag = true;

        $method = $params['method'];

        // 循环获取分页的数据

        while ($flag) {

            $itemsResponse = $youtubeRepository->$method($oauth,$params['part'],$params['params']);

            if ($itemsResponse && isset($itemsResponse->items)) {

                foreach($itemsResponse->items as $video) {

                    $snippet = $video->snippet;

                    if ($params['source_type_channel']) {

                        $videoId = $video->id->videoId;

                    } else {

                        $videoId = $snippet->resourceId->videoId;

                    }

                    $videoIdsArr[] = $videoId;

                    $number = $number + 1;

                    if ($video_count && ($number >= $video_count)) {

                        $number = 0;

                        break;

                    }

                }

            }

            if ($number && $itemsResponse && $itemsResponse->nextPageToken) {

                $params['params']['pageToken'] = $itemsResponse->nextPageToken;

                $flag = true;

            } else {

                unset($params['params']['pageToken']);

                $flag = false;

            }

        }

        return $videoIdsArr;

    }

3:转换成do while循环:

// 循环获取分页的数据
do {
    $res = $youtubeRepository->listSearch(null, 'snippet', $params);
    if ($res) {
        foreach ($res->items as $item) {
            $videos[] = [
                $item->id->videoId,
                $item->snippet->publishedAt,
                $item->snippet->title,
            ];
        }
        if ($res->nextPageToken) {
            $params['pageToken'] = $res->nextPageToken;
        }
    } else {
        $this->error('listSearch failed');
        $this->error(print_r($params, true));
        break;
    }
} while ($res->nextPageToken);

评论被关闭。