如何将curl_multi响应与对应venue id关联并生成目标数组
解决方案:关联CURL响应与对应Venue ID
嘿,这个问题其实很好解决——你需要做的就是把每个CURL请求和对应的venue id绑定起来,这样拿到响应的时候就能准确对应上了。这里有两种简单可靠的实现方式,我给你详细说说:
方法一:利用循环索引直接关联(最简单)
因为你发起请求的顺序和$venueLocation数组的顺序完全一致,foreach循环的索引$key可以直接用来关联原始数组中的venue id。修改你处理响应的代码片段即可:
foreach($result as $key => $estimatedTime) { // 直接通过当前索引从原始数组中获取对应的venue id $venueId = $venueLocation[$key]['id']; $te = []; $te['id'] = $venueId; if(!empty($estimatedTime['times'][0]['estimate'])) { $te['uber_eta'] = intval($estimatedTime['times'][0]['estimate'])/60; } else { $te['uber_eta'] = 'N/A'; } $teList[] = $te; }
这种方法零额外配置,完全依赖请求顺序和原始数组的一致性,适合你的当前场景。
方法二:用CURL的CURLOPT_PRIVATE存储自定义数据(更健壮)
如果担心请求顺序可能出现变化(虽然curl_multi_exec通常会保持顺序,但这种方法更灵活),可以给每个CURL句柄附加自定义数据(比如venue id)。
第一步:修改请求创建代码
在循环创建CURL句柄时,添加一行代码存储venue id:
foreach ($venueLocation as $i => $vloc) { $url = self::$uberApiTimeEstimate .'?start_latitude=' . $location['latitude'] . '&start_longitude=' . $location['longitude'] . '&end_latitude=' . $vloc['latitude'] . '&end_longitude=' . $vloc['longitude']; $multiCurl[$i] = curl_init(); // 注意:你原来的代码这里写错了,应该用拼接好的$url,不是$venueDetailApiUrl! curl_setopt($multiCurl[$i], CURLOPT_URL, $url); curl_setopt($multiCurl[$i], CURLOPT_HTTPHEADER, $headers); curl_setopt($multiCurl[$i], CURLOPT_HEADER, 0); curl_setopt($multiCurl[$i], CURLOPT_RETURNTRANSFER, true); // 将当前venue的id存入CURL句柄的私有数据字段 curl_setopt($multiCurl[$i], CURLOPT_PRIVATE, $vloc['id']); curl_multi_add_handle($mh, $multiCurl[$i]); }
第二步:修改响应处理代码
在获取响应时,取出之前存入的venue id并关联:
// 获取响应时同时取出venue id foreach($multiCurl as $k => $ch) { $response = json_decode(curl_multi_getcontent($ch), TRUE); // 从CURL句柄中取出存储的venue id $venueId = curl_getinfo($ch, CURLINFO_PRIVATE); // 将id和响应一起存储 $result[$k] = [ 'id' => $venueId, 'response' => $response ]; curl_multi_remove_handle($mh, $ch); } // 生成目标格式的$teList foreach($result as $item) { $te = []; $te['id'] = $item['id']; $estimatedTime = $item['response']; if(!empty($estimatedTime['times'][0]['estimate'])) { $te['uber_eta'] = intval($estimatedTime['times'][0]['estimate'])/60; } else { $te['uber_eta'] = 'N/A'; } $teList[] = $te; }
重要提示
我注意到你原代码中有一个明显的错误:curl_setopt($multiCurl[$i], CURLOPT_URL, $venueDetailApiUrl); 这里应该使用你拼接好的$url,否则所有请求都会发送到错误的地址,这可能也是你之前遇到问题的原因之一,记得修正!
内容的提问来源于stack exchange,提问作者Saswat
相关产品推荐
相关产品推荐

