我正在尝试解析一个可能有数千个结果的API响应,因此它提供了一个@odata.nextLink
。我希望在一个数组中返回所有结果,因此在发出一个具有nextLink
的curl请求后,我使用php aray联合将结果添加到前一个数组中
$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:好的,我对正在发生的事情有了更好的了解。接口以2d数组的形式返回value
,每个内部数组都是一个不同的记录。它多次返回100个结果,直到它提供5000个结果。阵列密钥每次都会重置。将初始$result_array
设置为前100个结果后,加号运算符不会附加下一个100个结果,因为它们是相同的键。一旦API开始返回5000个结果,它将从索引100追加到4999。后续请求不会像之前那样添加更多内容。php中是否有一个数组函数可以像+一样将多维数组添加到其他数组中?我可以做一个foreach
来正确地追加,但是如果已经有了一个内置的方法,那就太单调乏味了。
发布于 2018-08-16 03:54:53
对数组使用+需要注意的一件事是,如果元素键相同,或者数组没有显式键值,则不会添加任何元素。
例如:
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
)
*/
发布于 2018-08-16 22:25:12
我想通了,我觉得自己很傻。
foreach ($api_response['value'] as $key) {
array_push($result_array, $key);
}
不是最优雅的,但它是有效的。尽管如此,我想知道是否有内置的函数来处理这个问题。
https://stackoverflow.com/questions/51865180
复制相似问题