php - 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 条记录,因此看起来循环没有按预期工作。
解决方案
所以你的问题是你只取了两次。第二次,你从不检查$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 = "";
}
推荐阅读
- xaml - Xamarin 在两列中形成 CollectionView 数据在 iO 上的行中不对齐
- java - 尝试将按钮交换到某些矩形
- linux - 脚本的时间部分(运行时间)
- javascript - 使用 JS 在本地(客户端)处理上传的 JSON 文件的最佳方式
- arrays - C(指针)中几乎相同的代码的不同结果
- scala - 我将如何在 spark scala 中进行此数据帧转换?
- java - 打印机使用批量传输在 Java 中打印稀有字符
- powershell - 从 cmd / batch 运行 powershell 命令
- java - 如何对具有列表列表的自定义对象进行排序
- r - 按字符向量列表过滤数据帧