首页 > 解决方案 > PHP 在不知道数据数量的情况下循环遍历 JSON 数据

问题描述

我正在尝试从图像 API 获取所有图像。它一次最多返回 500 个结果,如果结果有一个next_page字段,那么我必须获取该字段的值并将其添加到 URL。代码应继续循环,直到该字段不存在。我使用以下代码来抓取前两页:

$key = true;
$link = 'https://url.com/dhj/?prefix=images&type=download';
$json = file_get_contents($link);
$data = json_decode($json, true);
$dataArray = array();
foreach ($data["images"] as $r)
{
    array_push($dataArray, array($r["id"], $r["image"]));
}
while($key)
{
    if($data["next_page"])
    {
        $key=true;
        $link2 = "https://url.com/dhj/?prefix=images&type=download&next_page=" . $data[$next_page];
        $json2 = file_get_contents($link2);
        $data2 = json_decode($json2, true);
        foreach ($data2["images"] as $r2)
        {
            array_push($dataArray, array($r2["id"], $r2["image"]));
        }
    }
    else
    {
        $key=false;
    }
}

这应该获取 2000 条记录,但只获取 1000 条记录,因此看起来循环没有按预期工作。

标签: phparrays

解决方案


所以你的问题是你只取了两次。第二次,你从不检查$data2下一页,所以一切都停止了。您不想继续这样下去,否则您将需要$data3,$data4等。

do/while循环类似于while循环,只是它总是至少运行一次。在循环结束而不是开始时评估条件。您可以使用该行为来确保始终获得第一页数据,然后使用条件检查是否应该继续获得更多数据。

$page = "";
do {
    $link = "https://url.com/dhj/?prefix=images&type=download&next_page=$page";
    $json = file_get_contents($link);
    $data = json_decode($json, true);
    foreach ($data["images"] as $r) {
        $dataArray[] = [$r["id"], $r["image"]];
    }
    $page = $data["next_page"] ?? "";
} while ($page);

注意我已经摆脱了你的array_push()电话。这在 PHP 中很少使用,因为$var[]语法不那么冗长并且不需要预先声明数组。同样,对 的调用array()早已被数组文字语法的使用所取代。该表达式$page = $data["next_page"] ?? ""使用空合并运算符,与以下内容相同:

if (isset($data["next_page"])) {
    $page = $data["next_page"];
} else {
    $page = "";
}

推荐阅读