我有一个很大的列表,如何将foreach中的每个循环从文件'list.csv'中排除到通过foreach的行?
$myGetCsv = function ($str) {
return str_getcsv($str, ';');
};
$lines = array_map($myGetCsv, file(''.get_template_directory_uri() . '/list.csv'));
foreach($lines as list($var1, $var2)) {
//CODE
}
示例:
原始档案:
test1, subtest1; // test1 is $var1 and subtest1 is $var2
test2, subtest2;
test3, subtest3;
第一个foreach之后list.csv
test2, subtest2;
test3, subtest3;
第二个foreach之后list.csv
test3, subtest3;
第三个foreach之后list.csv
empty
答案 0 :(得分:1)
根据您在注释中的说明,看起来您尝试从文件中删除行的唯一原因是因为您无法将整个文件加载到内存中并希望以多个方式解析大文件执行剧本。
如果上述陈述是准确的,简短的回答是您不必将整个文件加载到内存中。
您可以使用类SplFileObject
逐个遍历整个文件。只要确保在循环中你没有缓存内存中的行,并将它像数据库一样保存到新目的地。
示例:
$file = new SplFileObject('/path/to/file/list.csv');
$file->setFlags(SplFileObject::READ_CSV);
$file->setCsvControl(';');
// Iterate through the whole file reading on line at a time
foreach ($file as $row) {
list($var1, $var2) = $row;
// Do what you want her but do not keep row info in memory
}