Php CSV到数组和foreach到每行

Php CSV到数组和foreach到每行,php,magento,magento-1.7,Php,Magento,Magento 1.7,我有一个CSV,其中有多行。我试图让我的代码通过每一行foreach,但它似乎在第一行之后停止 该脚本正在更新多个产品的Magento价格,但在“\ux”之前SKU的起始编号相同。您可以看到这是代码 我想这就是它可能被卡住的地方,因为阵列不是平坦的,或者foreach被卡住了,我不确定 $rows = array_map('str_getcsv', file('price/price-update.csv')); $header = array_shift($rows);

我有一个CSV,其中有多行。我试图让我的代码通过每一行foreach,但它似乎在第一行之后停止

该脚本正在更新多个产品的Magento价格,但在“\ux”之前SKU的起始编号相同。您可以看到这是代码

我想这就是它可能被卡住的地方,因为阵列不是平坦的,或者foreach被卡住了,我不确定

 $rows = array_map('str_getcsv', file('price/price-update.csv'));
        $header = array_shift($rows);
        //var_dump($rows);
        $csv = array();

        foreach ($rows as $row) {
            $csv[] = array_combine($header, $row);
            $productcode = $csv[0]['Product Code'];
            $newprice = $csv[0]['New Price'];
            $specialprice = $csv[0]['Special Price'];
            $status = $csv[0]['Status'];
            var_dump($productcode);

            for ( $i = 1; $i < 15; $i++ ) {


                $magentoSku = $productcode."_0".$i;

                var_dump($magentoSku);
                // get magento product based on sku above
                $product =  Mage::getModel('catalog/product')->loadByAttribute('sku',$magentoSku);
                //var_dump($product);

                if ( $product->getSku() == $magentoSku ) {

                    //sku match, update price
                    $product->setPrice($newprice); 
                    $product->setSpecialPrice($specialprice);
                    if ($status == "A") {
                        $product->setStatus(1); 
                    } else {
                        $product->setStatus(0); 
                    }    
                    $product->save();
                    //var_dump($product);

                } else {

                    echo "No Match";
                    // sku doesnt match, don't update anything, and continue looping

                }       
            }
        }
$rows=array_map('str_getcsv',file('price/price update.csv');
$header=数组移位($rows);
//变量转储(行);
$csv=array();
foreach($行作为$行){
$csv[]=array_combine($header,$row);
$productcode=$csv[0]['Product Code'];
$newprice=$csv[0][“新价格”];
$specialprice=$csv[0][“特殊价格”];
$status=$csv[0]['status'];
var_dump($productcode);
对于($i=1;$i<15;$i++){
$magentoSku=$productcode.“\u 0”。$i;
var_dump($magentoSku);
//根据上述sku获取magento产品
$product=Mage::getModel('catalog/product')->loadByAttribute('sku',$magentoSku);
//var_dump($产品);
如果($product->getSku()==$magentoSku){
//sku匹配,更新价格
$product->setPrice($newprice);
$product->setSpecialPrice($specialprice);
如果($status==“A”){
$product->setStatus(1);
}否则{
$product->setStatus(0);
}    
$product->save();
//var_dump($产品);
}否则{
呼应“不匹配”;
//sku不匹配,不更新任何内容,继续循环
}       
}
}
$rows的输出:


array(2){[0]=>array(15){[0]=>string(7)“1234150”[1]=>string(9)“HEADBOARD”[2]=>string(8)“WING 6'0”[3]=>string(0)”[4]=>string(6)“459.99”[5]=>string(7)“1121115”[6]=>string(6)“279.99”[7]=>string(7)“1130610”[8]=>string(1)“0”[9]>string(1)”0”[10]=>string(1)“12”=>=>string(1)“C”[14]=>string(18)”可订购“}[1]=>array(15){[0]=>string(7)“1234149”[1]=>string(9)“HEADBOARD”[2]=>string(8)“WING 6'0”[3]=>string(0)”[4]=>string(6)“459.99”[5]=>string(7)“1121115”[6]=>string(6)”279.99”[7]=>string(7)“1130610”[8]=>string(1)“0”=>=>string(1)“0”[12]=>string(1)“Y”[13]=>string(1)“C”[14]=>string(18)”可供订购“}

我猜您的CSV文件中有错误,请使用您喜爱的电子表格编辑器打开它,然后选择分隔符和附件。如果这张桌子看起来不错,那就打开它
Varien\u文件\u Csv
Class

protected function _parseCSV($file)
    {
        $csv = new Varien_File_Csv();
        $csv->setDelimiter(',');
        $csv->setEnclosure('"');

        $data = $csv->getData($file);
        //$this->_headLine = array_shift($data);

        return $data;
    }

如何使用$csv[]=array_combine($header,$row);如果要将一个新数组推送到$csv,这也可能会带来一些麻烦。我建议您在每次迭代中使用Mage::log(),并检查数据的外观。这是一个简单的问题,但您有代码…

除了这一部分,您的逻辑大部分是正确的

//this should be assigned to a separate variable first
$csv[] = array_combine($header, $row);
//because in second iteration, the data you require is in $csv[1]
//this will essentially fetch only the first productcode always for all rows.
$productcode = $csv[0]['Product Code'];
下面是经过更正的片段

foreach ($rows as $row) {
    // assign it to a var
    $csv_data = array_combine($header, $row);
    $productcode = $csv_data['Product Code'];
    $newprice = $csv_data['New Price'];
    $specialprice = $csv_data['Special Price'];
    $status = $csv_data['Status'];
    // stuff it into an array later
    $csv[] = $csv_data;
    var_dump($productcode);

CSV文件的条目是什么样子的?你能看到你的
var\u转储($rows)输出是否正确?@crmpicco我在问题中为您添加了这个元素,因此您的数组有两个元素-这是您所期望的吗?另外,这是
$csv[]=array\u combine($header,$row)正确吗?在使用array\u combine并检查这是否是您要查找的内容后,是否可以转储
$csv
?文件中的行总数是多少?它们是否超过2行?@Kalyan将有更多的行,我只使用两行来测试CSV中没有任何错误,因为预期的行数为2。csv中的转储有2个。感谢您的反馈,我已经实现了您的建议,但它似乎在第一行之后仍然停止。@KMW您能检查csv中的第一行是否有字段名吗?是的,它在csv中确实有字段名作为第一行,就好像它通过循环一次,然后停止一样