You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:39:59