You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 5中如何循环遍历API响应分页并合并结果?

解决API多页活动数据合并的问题

看起来你已经有了一个不错的开头,要实现调用API前10页数据并合并到私有数组里,我们可以完善代码的错误处理、数据解析和数组追加逻辑,确保整个过程稳定可靠。

这里是优化后的完整实现:

class EventFetcher {
    private $events = [];

    public function events_beta($location): array {
        try {
            // 循环获取1到10页的数据
            for ($i = 1; $i <= 10; $i++) {
                // 构建带页码参数的API请求URL,注意对动态参数做URL编码
                $apiUrl = "http://api.**.com/json/events/search?app...&location=" . urlencode($location) . "&page={$i}";
                
                // 推荐用curl替代file_get_contents,可控性更强,不受配置限制
                $ch = curl_init($apiUrl);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 添加超时避免请求挂起
                
                $response = curl_exec($ch);
                $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
                
                // 检查请求是否成功
                if ($response === false || $httpCode !== 200) {
                    $error = curl_error($ch);
                    curl_close($ch);
                    throw new Exception("请求第{$i}页失败: {$error} (HTTP状态码: {$httpCode})");
                }
                curl_close($ch);
                
                // 解析JSON响应并检查解析结果
                $data = json_decode($response, true);
                if (json_last_error() !== JSON_ERROR_NONE) {
                    throw new Exception("第{$i}页JSON解析失败: " . json_last_error_msg());
                }
                
                // 假设API返回的活动数据在$data['events']字段下,根据实际结构调整
                if (!empty($data['events']) && is_array($data['events'])) {
                    // 将当前页数据追加到私有数组
                    $this->events = array_merge($this->events, $data['events']);
                    // PHP7.4+也可以用更简洁的写法:$this->events = [...$this->events, ...$data['events']];
                } else {
                    error_log("第{$i}页未返回有效活动数据");
                    // 如果API返回空数据时无需继续请求,可在这里加break终止循环
                }
            }
        } catch (Exception $e) {
            // 异常处理:记录日志,可选是否抛出异常(比如允许返回已获取的部分数据)
            error_log("获取活动数据出错: " . $e->getMessage());
            // 若需要中断流程则抛出异常:throw $e;
        }
        
        return $this->events;
    }
}

关键细节说明:

  • 请求可靠性:用curl替代file_get_contents,能更好处理HTTP错误、超时、重定向,且不受allow_url_fopen配置限制。
  • 参数安全:对$location做urlencode(),避免特殊字符破坏URL结构。
  • 错误捕获:分环节检查请求状态、HTTP响应码、JSON解析结果,确保问题可追溯。
  • 数组合并:用array_merge()或展开运算符完成数据追加,保证数组结构正确。
  • 容错性:即使某一页请求失败,也能返回已成功获取的前几页数据(按需调整异常处理逻辑)。

另外要注意:需根据API实际返回结构调整$data['events']字段;如果API有请求频率限制,可在循环中添加sleep(1)这类延迟,避免触发封禁。

内容的提问来源于stack exchange,提问作者Seio. E.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:32:58