PHP CLI -f数组联合在5000个元素后停止

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (68)

我正在尝试解析一个可以有数千个结果的API响应,因此它提供了一个@odata.nextLink。我想在数组中返回所有结果,所以在我创建了一个curl请求后nextLink,我使用php aray union添加到前一个数组中

$result_array = $api_response['value']; //store initial response

while (array_key_exists('@odata.nextLink', $api_response)) {

    curl_setopt_array($curl, array(
       CURLOPT_URL => $api_response['@odata.nextLink'],
       (more options)...
    )):

    $response = curl_exec($curl);
    $err = curl_error($curl);

    curl_close($curl);

    if ($err) {
        echo "cURL Error #:" . $err;
    } else {
        echo $response;
        $api_response = json_decode($response, TRUE);
        $result_array = $result_array + $api_response['value'];
    }
}

响应看起来像这样

{
  "@odata.context":"https:/api.com/v1/query","value":[
    {
      "Sku":"ABC","ID":123
    },
    (more records)...
  ],"@odata.nextLink":"https://api.com/v1/query&$skip=200"
}

数组看起来像这样 print_r

(
    [0] => Array
        (
            [Sku] => abc
            [ID] => 123
        )

    [1] => Array
        (
            [Sku] => efg
            [ID] => 456
        )
    (more results)...

)

但是,它会在5000之后停止向数组添加元素。我执行脚本文件以php -f进行测试。我尝试ini_set('memory_limit', '1000M');建议克服内存限制,但它没有帮助。这是PHP CLI的某种限制吗?在现场服务器上还会发生这种情况吗?最后,我想对大型数据集(可能是批量)中的每个产品ID发出另一个curl请求,以查看api是否可以处理它。

编辑:当我的意思是设置curl时,我正在将curl请求更改为下一个链接。我添加了更改以进行说明,并表明它不会无限循环。

编辑2:好的,所以我可以更好地了解正在发生的事情。API返回value2d数组,每个内部数组是不同的记录。它返回100次结果几次,直到它为5000.数组键每次重置。设置初始$result_array值后设置为前100个结果,加号运算符不会追加下一个100,因为它们是相同的键。一旦API开始返回5000个结果,它将从索引100追加到4999.后续请求不会像以前那样添加更多。在php中是否有一个数组函数可以将多维数组相互追加,就像+一维数组一样?我可以做一个foreach正确追加但如果已经有一个内置方法似乎很乏味。

提问于
用户回答回答于

有关使用+ with arrays的一点要注意的是,如果元素键相同或者数组未明确键入,则不会添加任何元素。

例如:

var_dump(['a','b','c'] + ['d','e','f']); 
/* outputs
array(3) {
  [0]=> "a"
  [1]=> "b"
  [2]=> "c"
}
*/

print_r([0=>'a',1=>'b',2=>'c'] + [3=>'d',4=>'e',5=>'f']);
/* outputs
array(6) {
  [0]=>"a"
  [1]=>"b"
  [2]=>"c"
  [3]=>"d"
  [4]=>"e"
  [5]=>"f"
} */

如果要添加具有相同键的元素,请使用array_merge

print_r(array_merge(['a','b','c'], ['d','e','f']));
/* outputs
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => e
    [5] => f
)
*/

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励