str_getcsv() 的自定义数组键


custom array keys for str_getcsv()

这个逐键迭代键是为我的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);

下面标记的答案是我相信对于那些有需要的人来说,这是一个更专业的实施。

谢谢大家。

您可能希望使用 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 字段作为字符串提供。例如,如果您希望将代码作为整数,名称作为字符串,将价格作为浮点数,并将每一行替换为整数,则可以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);
}