【问题标题】:How to include all next page data within single PHP foreach loop using JSON data如何使用 JSON 数据在单个 PHP foreach 循环中包含所有下一页数据
【发布时间】:2016-01-29 00:14:07
【问题描述】:

我有一个 JSON 文件,每页限制为 50 项,而这一项共有 818 项。

我可以单独从前 50 个中提取数据。 我想知道是否有人知道我如何也可以拉出所有附加页面,以便它们都在一个 php 请求中。

有没有人碰巧有一个函数或 if 语句可以帮助解决这个问题?

结果数量有限的 json 示例片段(将显示 50 个):

{
    "count": 818, 
    "max_per_page": 50, 
    "current_page": 1, 
    "links": [
        {
            "href": "http://domain.com/?page=2", 
            "rel": "next"
        }, 
        {
            "href": "http://domain.com/", 
            "rel": "prev"
        }
    ], 
    "results": [
        {
            "id": "1", 
            "href": "http://domain.com/23385", 
            "product_line": "A", 
            "departures_start_date": "2015-01-01", 
            "departures_end_date": "2017-12-24"
        }, 
        {
            "id": "2", 
            "href": "http://domain.com/22760", 
            "product_line": "B", 
            "departures_start_date": "2015-01-01", 
            "departures_end_date": "2017-12-16"
        }, 
        {
            "id": "3", 
            "href": "http://domain.com/22790", 
            "product_line": "C", 
            "departures_start_date": "2015-01-01", 
            "departures_end_date": "2017-12-30"
        }, 
    ]
}

【问题讨论】:

  • 你是如何在php 中创建你的json 对象的?
  • 我们可以建议如何创建一个循环来检索所有数据,但是您知道如何检索剩余的 json 数据吗?
  • 嘿@roullie 我正在使用 GET 并将其解析为变量并手动创建我自己的用于导入的 JSON 文件。我基本上是在剥离我不想使用的部分,并且由于我需要的最后一条数据有一个分页 json 限制,每页 50 个项目,我被限制轻松访问所有数据。
  • 嘿@fusion3k 我相信我知道如何检索剩余的 json,我唯一需要知道的是,如果使用你的循环,我是否会使用(当我超过 50 时)使用 51 之类的东西下一页将有 '$productline = $loopresult['results']['51']['product_line'];'
  • 您能具体描述一下您要完成的工作吗? (因为我在这里感觉到 XY 问题。)您是否使用 AJAX 检索 JSON?然后在单击页码时加载每个 50 项集?如果您使用 AJAX 执行此操作,请改为修改 AJAX 回调函数。在我看来,这不像是一个 PHP 问题,因为您决定要回传什么。

标签: php json


【解决方案1】:

假设您使用file_get_contents 检索数据,您可以试试这个:

$array = array();
$page = 1;
while( $data = file_get_contents( '/Your/Path/Here?page=$page++' ) )
{
    $json = json_decode( $data, True );                                   #01
    foreach( $json['results'] as $row ) $array[] = $row;
}

在循环结束时,数组将包含所有元素:

[
    [
        "id": "1", 
        "href": "http://domain.com/23385", 
        (...)
    ], 
    [
        "id": "2", 
        "href": "http://domain.com/22760", 
        (...)
    ], 
    (...) 
]

如果你更喜欢对象而不是数组,你可以省略True (#01),然后每一行都可以通过$row->id而不是$row['id']调用

【讨论】:

  • 嘿 Fusion3k,感谢您的意见,但遗憾的是我相信我错过了沟通。我已经有一个与您描述的方式类似的 foreach 循环。我没有使用 file_get_contents。我遇到的麻烦是我可以做一个 foreach 循环,它会拉出前 50 个项目。但是在顶部它说分页限制为每页 50 个,并且总共有 818 个 id。这意味着我至少需要调用 17 页来获取所有数据。我正在尝试查看是否可以创建一个函数来遍历所有这些页面,以便我可以获取所有 818 id 的内容,例如 product_line 以及开始和结束日期。
  • 例如,如果我使用了您的$array = array(); while( $data = file_get_contents( 'http://domain.com/?page=1' ) ) { $json = json_decode( $data, True ); #01 foreach( $json['results'] as $row ) $array[] = $row; },并且我想将其存储在数组中,例如 .= $array;所以我可以在第 2、3、4 页上再循环一次,一直到它检测到的最后一页。
  • 使用$pagenum = 1; while( file_get_contents( 'domain.com/?page=$pagenum++'))(没有;!)当内容为空时我的while循环停止,但你知道如何检测最后一页吗?如果您愿意,您可以检索总页数(在本例中为 $totpag = ceil(818/50)),然后使用 for( $page=1; $page<=$totpag; $page++ ) 而不是 while。我说清楚了吗?
  • 非常有帮助@fusion3k,非常感谢!我希望我能评价你的答案,但一旦我有排名,我肯定会对其进行排名。 +1 感谢您的帮助
  • @user5706571 不客气。不管评分如何,但请标记答案,以便问题可以归档并关闭
猜你喜欢
  • 1970-01-01
  • 2011-06-01
  • 2014-01-26
  • 2021-10-25
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
相关资源
最近更新 更多