下面的代码应该输出4个字段到CSV, Category, SKU, Price and Special Price
,并且大多数情况下工作良好,除了输出在所有项目周围有3个引号,如
"""Joystick Head""","""Man222""","""155""","""124.95"""
但是浏览器的输出是正常的
Type: "Joystick Head" SKU: "Man222" Price: "155" Special Price: "124.95"
我试过str_replace
, implode
和任何其他我能想到的,有不同的结果,有时设法删除几乎所有的报价。
我希望这是一些愚蠢的东西,我已经盯着它太久了,帮助吗?
define('SAVE_FEED_LOCATION','var/export/prices.csv');
set_time_limit(0);
require_once 'app/Mage.php';
Mage::app('default');
try{
$handle = fopen(SAVE_FEED_LOCATION, 'w');
$attributeName = 'producttype';
$products = Mage::getModel('catalog/product')->getCollection();
$products->addAttributeToFilter('status', 1);
$products->addAttributeToFilter('visibility', 4);
$products->addAttributeToSelect('*');
$prodIds = $products->getAllIds();
$product = Mage::getModel('catalog/product');
$counter_test = 0;
foreach($prodIds as $productId) {
if (++$counter_test > 0 && $counter_test < 100){
$product->load($productId);
$product_data = array();
$productId = $product->getId();
$productAtt = Mage::getModel('catalog/product')->load($productId);
$attributes = $productAtt->getAttributes();
$attributeValue = null;
if(array_key_exists($attributeName , $attributes)){
$attributesobj = $attributes["{$attributeName}"];
$attributeValue = $attributesobj->getFrontend()->getValue($productAtt);
}
if ($attributeValue == "No")
{
$attributeValue = NULL;
}
$product_data['producttype'] = $attributeValue;
$product_data['sku'] = $product->getSku();
$product_data['price'] = round($product->getPrice(),2);
$product_data['special_price'] = round($product->getSpecialprice(),2);
// if no special price use normal price
if ($product_data['special_price'] == NULL) {
$product_data['special_price'] = round($product->getPrice(),2);
}
foreach($product_data as $k=>$val){
$bad=array('"',"'r'n","'n","'r","'t");
$good=array(""," "," "," ","");
$product_data[$k] = '"'.str_replace($bad,$good,$val).'"';
}
echo "Type: ". $product_data['producttype'] . " SKU: " . $product_data['sku'] . " Price: ". $product_data['price'] . " Special Price: " . $product_data['special_price'] . "<br>";
fputcsv($handle, $product_data, ',', '"');
}
}
fclose($handle);
echo '<br> Completed at: ' . time();
}
catch(Exception $e){
$headers = 'Content-type: text/html; charset=iso-8859-1' . "'r'n";
error_log($e->getMessage(), 1, 'myemail@mydomain.com', $headers);
die($e->getMessage());
}
问题在行
$product_data[$k] = '"'.str_replace($bad,$good,$val).'"';
代码在数组的每个值上加上双引号。随后,fputcsv()
通过将引号翻三倍来转义引号,以CVS格式正确输出数据。您可以查看PHP文档中fputcsv()
的示例,以了解这是正常的行为。
3x双引号没有错,因为它只是一种在原始数据中保留双引号的方法,同时通过CSV传输将值传递给另一个系统。然而,如果你故意去掉双引号,那么这一行看起来就像是打错字了。预计为:
$product_data[$k] = str_replace($bad, $good, $val);
<其他说明/strong>
- 您不需要从值中去掉双引号。这不是一个CSV的错误符号。我建议从坏的符号中删除双引号,根本不介意三个双引号。
-
str_replace()
可以将array作为第三论点。因此,您可以在一次调用中替换所有坏值,而不是在foreach
周期中执行。例如:$product_data = str_replace($bad, $good, $product_data);
- 你不需要分别重新声明坏值和好值数组循环迭代。它们在脚本中没有改变,所以它们的声明可以改变移动到
foreach ($prodIds as $productId) {
行 前