将csv与数组进行比较

时间:2014-07-19 11:28:13

标签: php arrays csv

我正在尝试将csv数据与我的数组进行比较,因此csv ocuk有大约7000行,我想只显示与$ sku数组匹配的csv数据,该数组最终会有大约500个项目以后到数据库数组,但现在我只是想让它正常运行

<?php

$sku = array("WC-564-EK","WC-562-EK");
echo '<table>'; //start table
$ocuk = fopen("ocuk.csv", "r");
while (($csv = fgetcsv($ocuk, 10000, ',')) !== FALSE)
{
   foreach ($sku as $var)
   {
      for ($i=; $i<=10000; $ii)
      {
         if (strtolower ($var)==strtolower($csv[$i]))
         {
            echo '<tr><td>',$csv[0], //brand
            '</td><td>',$csv[1], //stockcode
            '</td><td>',$csv[2], //desc
            '</td><td>',$csv[3], //quantiy
            '</td><td>',$csv[4], //resellerprice
            '</td><td>',$csv[5], //ean
            '</td><td>',$csv[6], //mpn
            '</td></tr>';
          }
      }
  }
}
fclose($handle);
echo '</table>'; //end table

?>

我得到的只是空白输出

1 个答案:

答案 0 :(得分:0)

而不是/ while / fore / for / if check,请尝试使用

while (($csv = fgetcsv($ocuk)) !== FALSE)
{
    if (false === empty(array_intersect($sku, array_map('trim', $csv)))) {
        echo …
    }
}

作为替代方案,请考虑

class RowContainsValuesFilter extends FilterIterator
{
    private $valuesToSearchFor;

    public function __construct(Iterator $iterator, array $valuesToSearchFor)
    {
        $this->valuesToSearchFor = $valuesToSearchFor;
        parent::__construct($iterator);
    }

    public function accept()
    {
        return !empty(
            array_intersect(
                $this->valuesToSearchFor,
                array_map('trim', $this->current())
            )
        );
    }
}

以这种方式封装过滤器逻辑,可以轻松地在任何需要的地方重用逻辑,而无需将比较放在您使用它的位置。这使得在稍后阶段更改逻辑变得更加容易。你所做的就是:

$sku = array("WC-564-EK","WC-562-EK");
$file = new SplFileObject("ocuk.csv");
$file->setFlags(SplFileObject::READ_CSV);
$filteredFile = new RowContainsValuesFilter($file, $sku);

foreach ($filteredFile as $row) {
    // this will only give rows for which the filter criteria apply
}

参考: