多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);
核心逻辑说明
关联数组实现高效去重:
放弃原代码直接push数组的方式,改用$productsById关联数组,以产品id为键。无需循环遍历整个数组查找重复项,直接通过键名判断是否存在,大幅提升处理效率。门店信息聚合:
- 遍历每个门店的产品列表时,先获取当前产品的
id。 - 若产品已在关联数组中,直接将当前门店名称追加到该产品的
stores数组。 - 若产品不存在,为其初始化
stores数组(存入当前门店),再将产品存入关联数组。
- 遍历每个门店的产品列表时,先获取当前产品的
还原索引数组结构:
最后通过array_values()将关联数组转为普通索引数组,保证输出结构与原API返回的数组格式一致。
注意事项
- 产品ID的获取方式:如果
prices类的id是私有属性(示例中#container为私有),需要使用类提供的getter方法(如$product->getId())或访问容器数组(如$product->getContainer()['id'])来获取ID,需根据实际类结构调整。 - 不可修改对象的处理:若
prices对象是不可实例化或不可修改的,可先将对象转为数组((array)$product),添加stores字段后再存入关联数组;若最终需要对象结构,可重新实例化prices类并赋值所有字段。
内容的提问来源于stack exchange,提问作者Geoff_S
相关产品推荐
相关产品推荐

