为了账号安全,请及时绑定邮箱和手机立即绑定

在 PHP 7.2 和 Prestashop 1.7 上导出 XML 多个值时出现问题

在 PHP 7.2 和 Prestashop 1.7 上导出 XML 多个值时出现问题

PHP
江户川乱折腾 2023-04-28 14:53:39
我正在尝试将产品从 Prestashop 1.7 导出到 XML。一切正常,但脚本多次导出产品,具体取决于所属类别。例如 Product1 在 All products - Clothes - Men 中,在这种情况下将以 XML 导出 3 次。我尝试使用基于产品 ID 的 array_unique,但它不起作用。有人可以给我指出正确的方向吗?完整的代码可以在这里找到: https: //pastebin.com/MQxfYSj2在这部分代码中,我尝试使用 array_unique 但没有结果: private function getProductFromArray($arrProduct){    $objProduct = new Okazii_Connector_Product();    $objProduct->ID = $arrProduct['id_product'];    $objProduct->UniqueID = $arrProduct['id_product'];    $objProduct->Title = $arrProduct['name'];    if (mb_strlen($arrProduct['description']) > 3){        $objProduct->Description = $arrProduct['description'];    } else if (mb_strlen($arrProduct['description_short'])) {        $objProduct->Description = $arrProduct['description_short'];    } else {        $objProduct->Description = $arrProduct['name'];    }    $objProduct->Amount = $arrProduct['quantity'];    if ($objProduct->Amount == 0){        $objProduct->Amount = $this->getAmountFromStock($arrProduct['id_product']);    }    $objProduct->Category = $this->getCategoryString($arrProduct['id_category']);    $objProduct->Currency = $this->getCurrency();    $objProduct->Price = $arrProduct['price'];    if(!empty($arrProduct['available_now']) && $objProduct->Amount > 0)    {        $objProduct->InStock = $arrProduct['available_now'];    }    if(!empty($arrProduct['gtin']))    {        $objProduct->GTIN = $arrProduct['gtin'];    }    else if(!empty($arrProduct['ean13']))    {        $objProduct->GTIN = $arrProduct['ean13'];    }    else if(!empty($arrProduct['isbn']))    {        $objProduct->GTIN = $arrProduct['isbn'];    }    $this->setProductImages($objProduct);    $this->setProductBrand($objProduct, $arrProduct['id_manufacturer']);    return $objProduct;}我还尝试在脚本顶部仅获取基于产品 ID 的唯一产品,但效果不佳。其他有用信息:PHP 7.2、Prestashop 1.7.6.5
查看完整描述

1 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

尝试在类的最开始创建一个属性,例如


private $exportedProductsIds = [];


然后在每次迭代之后,在返回之前将导出的产品 ID 放入其中


array_push($this->exportedProductsIds, $objProduct->id);

然后在运行前添加验证,如果 id 已经在$exportedProductsIds然后跳过迭代


if (!in_array($objProduct->id, $this->exportedProductsIds)) {

   //run your code

}

但我认为放置此代码的最佳位置是您调用getProductFromArray方法的地方。


我假设是这样的


private function exportProducts($products)

{

     foreach ($products as $product) {

         if (in_array($objProduct->id, $this->exportedProductsIds)) {

             continue;

         }

         if ($this->getProductFromArray($arrProduct)) {

             array_push($this->exportedProductsIds, $objProduct->id);

         }

     }

}


查看完整回答
反对 回复 2023-04-28
  • 1 回答
  • 0 关注
  • 80 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信