PHP实现JSON产品描述按规则批量修改需求求助
处理JSON产品描述的PHP解决方案
Hey there! I get that you're new to PHP and stuck with this JSON processing task—let's fix that together. Your goal is to clean up product descriptions where items share the same BrandId and only differ by the volume (like "50 ml") at the end of their Description, right? Here's a complete, commented solution:
完整代码实现
<?php // 读取原始JSON文件 $url = 'similar-product.json'; $data = file_get_contents($url); $products = json_decode($data, true); // 转成关联数组,更易操作 // 第一步:分组产品,键为「BrandId_去掉容量的描述主体」 $productGroups = []; foreach ($products as $product) { // 正则匹配并移除末尾的容量部分(格式:空格+数字+空格+ml,位于字符串结尾) $descriptionBase = preg_replace('/ \d+ ml$/', '', $product['Description']); // 生成分组键:确保同品牌、同核心描述的产品分到一组 $groupKey = $product['BrandId'] . '_' . $descriptionBase; if (!isset($productGroups[$groupKey])) { $productGroups[$groupKey] = [ 'baseDescription' => $descriptionBase, 'products' => [] ]; } $productGroups[$groupKey]['products'][] = $product; } // 第二步:处理每个分组的产品 $processedProducts = []; foreach ($productGroups as $group) { // 分组内产品数量>1,说明是同品牌同核心描述仅容量不同的产品,需要统一修改描述 $shouldCleanDescription = count($group['products']) > 1; foreach ($group['products'] as $product) { if ($shouldCleanDescription) { $product['Description'] = $group['baseDescription']; } $processedProducts[] = $product; } } // 第三步:保存处理后的JSON到新文件 $outputFile = 'processed-products.json'; file_put_contents($outputFile, json_encode($processedProducts, JSON_PRETTY_PRINT)); echo "处理完成!结果已保存到 {$outputFile}"; ?>
代码关键部分解释
- 正则匹配清理描述:
preg_replace('/ \d+ ml$/', '', $product['Description'])精准定位字符串末尾的「空格+数字+空格+ml」格式,提取出描述的核心主体部分。 - 产品分组逻辑:通过
BrandId+核心描述的组合键,把同品牌、同核心描述的产品归为一组,精准筛选出需要统一修改描述的产品集合。 - 批量修改判断:当分组内产品数量大于1时,说明这些产品符合「仅容量不同」的条件,统一替换为清理后的描述;单产品分组则保留原描述。
- JSON格式化输出:
JSON_PRETTY_PRINT参数让输出的JSON文件格式工整,方便后续查看和使用。
验证结果
运行代码后,生成的processed-products.json会和你期望的输出完全一致:前三个BrandId为10000的产品描述会被统一为test one perf,最后一个BrandId为20000的产品因为没有同组匹配项,保留原描述test sec perf 50 ml。
内容的提问来源于stack exchange,提问作者kashalo
相关产品推荐
相关产品推荐

