我正在尝试将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
?>
我得到的只是空白输出
答案 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
}
参考: