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

多API调用结果合并:按产品ID聚合门店信息的PHP实现问题

解决方案:按产品ID聚合门店信息并合并数据

修改后的完整代码

$IdentifierTest = 1472;
$arguments = ['store 1', 'store 2', 'store 3'];

$TestApi = app(TestApi::class);
// 用产品ID作为键的关联数组,用于快速去重和匹配
$productsById = [];

foreach($arguments as $storeName){
    $testResponse = $TestApi->getData($IdentifierTest, $storeName);
    $storeProducts = $testResponse->getResult()->getData();
    
    foreach($storeProducts as $product){
        // 根据实际对象结构获取产品ID,示例假设可直接访问id属性
        // 若container是私有,可改用 $product->getContainer()['id'] 或对应getter方法
        $productId = $product->id;
        
        if(isset($productsById[$productId])){
            // 产品已存在,追加当前门店到stores数组
            $productsById[$productId]->stores[] = $storeName;
        } else {
            // 产品不存在,初始化stores数组并存储产品
            $product->stores = [$storeName];
            $productsById[$productId] = $product;
        }
    }
}

// 转换为索引数组,保持与原API返回的结构一致
$newArray = array_values($productsById);

$this->makeFile($IdentifierTest, $newArray);

核心逻辑说明

  1. 关联数组实现高效去重:
    放弃原代码直接push数组的方式,改用$productsById关联数组,以产品id为键。无需循环遍历整个数组查找重复项,直接通过键名判断是否存在,大幅提升处理效率。

  2. 门店信息聚合:

    • 遍历每个门店的产品列表时,先获取当前产品的id。
    • 若产品已在关联数组中,直接将当前门店名称追加到该产品的stores数组。
    • 若产品不存在,为其初始化stores数组(存入当前门店),再将产品存入关联数组。
  3. 还原索引数组结构:
    最后通过array_values()将关联数组转为普通索引数组,保证输出结构与原API返回的数组格式一致。

注意事项

  • 产品ID的获取方式:如果prices类的id是私有属性(示例中#container为私有),需要使用类提供的getter方法(如$product->getId())或访问容器数组(如$product->getContainer()['id'])来获取ID,需根据实际类结构调整。
  • 不可修改对象的处理:若prices对象是不可实例化或不可修改的,可先将对象转为数组((array)$product),添加stores字段后再存入关联数组;若最终需要对象结构,可重新实例化prices类并赋值所有字段。

内容的提问来源于stack exchange,提问作者Geoff_S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:45:37