PHP解析XML商品数据实现商品图片与对应价格匹配展示问题
问题根因
现有代码存在3个核心错误,直接导致所有商品价格相同、仅展示少量商品的问题:
- HTML拼接逻辑写在所有循环外层,遍历单品时
$price、$firstImage变量会被持续覆盖,最终只保留最后一个单品的价格和图片,因此所有商品展示的价格完全一致 $articles初始化位置放在PRODUCT循环内部,每遍历一个新的商品组就会清空之前拼接好的内容,最终只会保留最后一组商品的渲染结果- 单品循环内错误写了
$articles++,把字符串类型的拼接变量当成数字自增,完全没有执行预期的HTML拼接逻辑
修复方案
如果需要保留图片去重能力,可以用一个额外的数组存储已渲染过的图片链接,判断未重复再执行拼接,修复后代码如下:
$xml = simplexml_load_file($datei); // 初始化存储所有单品HTML的变量 放在所有循环外层 $articles = ""; // 初始化去重用的数组 存储已经出现过的图片链接 $existedImages = []; foreach($xml->PRODUCTDATA->PRODUCT as $p) { $prod = (string) $p->P_NAME->VALUE; foreach ($p->ARTICLEDATA->ARTICLE as $article) { $price = (string)$article->A_PRICEDATA->A_PRICE->A_VK; $firstImage = (string)$article->A_MEDIADATA->A_MEDIA; // 图片去重判断 不存在才渲染 if(!in_array($firstImage, $existedImages)){ // 将当前单品的HTML拼接到总变量中 $articles .= '<div class="photo"><img src="' . $firstImage . '" style="width: 120px;margin:5px;"><div class="product-info mt__15"><h3 class="product-title pr fs__14 mg__0 fwm">' . $prod . '</h3><span class="price">€' . $price . ' EUR</span></div></div>'; // 把当前图片加入已渲染列表 $existedImages[] = $firstImage; } } }
注:如果不需要跨PRODUCT去重,仅需要同一个PRODUCT下的图片去重,可以把
$existedImages的初始化放到PRODUCT循环内部即可。
内容的提问来源于stack exchange,提问作者Maher Haddad
相关产品推荐
相关产品推荐

