这个迭代是否按键为我的str_getcsv数组值初始化自定义命名键的正确方法? 在这个循环中,unset()也很昂贵甚至是必要的吗?
<?php
$lines = file('csv/random.csv', FILE_IGNORE_NEW_LINES);
foreach ($lines as $key => $value)
{
$temp = str_getcsv($value,'|');
$csv[$key]['code'] = $temp[0];
$csv[$key]['name'] = $temp[1];
$csv[$key]['price'] = $temp[2];
$csv[$key]['avail'] = $temp[3];
unset ($temp);
}
?>
修改
根据评论中的建议,代码看起来更整洁,现在运行得更快
$keys = Array('code','name','price','avail');
$file = fopen('csv/random.csv',"r");
while(! feof($file))
{
$temp[] = array_combine($keys,fgetcsv($file,'1000','|'));
}
fclose($file);
下面给出的答案是,我相信对于那些需要这样做的人来说,这是一个更专业的实施方式。
谢谢你们。
答案 0 :(得分:1)
您可能想要使用SplFileObject类:
<?php
$file = new SplFileObject('csv/random.csv');
$file->setFlags(SplFileObject::READ_CSV | SplFileObject::SKIP_EMPTY
| SplFileObject::DROP_NEW_LINE | SplFileObject::READ_AHEAD);
$file->setCsvControl('|');
$data = array();
foreach ($file as $row) {
$data[] = array_combine(array('code', 'name', 'price', 'avail'), $row);
}
您必须确保您的CSV行有4个不同的字段才能以这种方式使用array_combine()
。请注意,这将为您提供所有CSV字段作为字符串。例如,如果您希望代码为整数, name 为字符串, price 为float, avail 作为每行的整数,您可以将foreach
替换为:
foreach ($file as $row) {
$data[] = array_combine(
array('code', 'name', 'price', 'avail'),
array((int) $row[0], $row[1], (float) $row[2], (int) $row[3])
);
}
要应用int / float转换,您甚至可以使用fscanf()方法读取行:
<?php
$file = new SplFileObject('csv/random.csv');
$file->setFlags(SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE
| SplFileObject::READ_AHEAD);
$data = array();
while ($row = $file->fscanf('%d|%[^|]|%f|%d')) {
$data[] = array_combine(array('code', 'name', 'price', 'avail'), $row);
}