【问题标题】:How does fgetcsv( ) works under the hood?fgetcsv() 如何在后台工作?
【发布时间】:2014-01-27 08:57:00
【问题描述】:

我开发了一些 php 代码来读取 csv 文件(通过 fgetcsv() ),验证文件中的(自定义)标题,处理以下数据负载并将结果保存到数据库中。代码运行良好,但由于我没有将代码分解为函数而变得非常大(所有提到的操作都在典型的 while 循环中,如已知的 www.php.net/fgetcsv 的第一个示例)。

所以我想通过分解函数来重新组织我的代码,实际上是用方法定义一个类,我想知道我是否仍然需要while循环来访问整个文件,或者我是否可以使用fgetcsv() 具有以下示例中的各种方法?:例如在各种方法中依次调用 fgetcsv()。我不确定 fgetcsv() 在读取一行时是否会更改文件处理程序(指针)的值,因为我无法在手册 www.php.net/fgetcsv 或本网站的其他内容中找到它。

简化代码示例:

class Mycsvfile {

   $filehandle;

   function __construct($filename){} //opens the $file with a name; sets $filehandle

   function isValidHeader(){} //checks customised header; calls fgetcsv() 

   function processPayload(){} //processes the data payload after the header; calls fgetcsv() and database storage functions

   function close(){} //closes the csv file

}

$myfile = new Mycsvfile('aname');

if($myfile->isValidHeader){
  $myfile->processPayload();
}
$myfile->close();

【问题讨论】:

  • 我建议创建一个迭代器来解析文件,检查文档中的此注释以获取示例fr2.php.net/fgetcsv#57802,是的,它确实改变了指针
  • 它除了从句柄读取之外什么都不做:github.com/php/php-src/blob/…
  • 这个问题似乎跑题了,因为它属于codereview.stackexchange.com
  • 感谢所有 cmets (!)。 @Blender:如果它不做任何事情, fgetcsv() 如何确定下一行是什么? (参考 php.net/fgetcsv 中的 'while (($data = fgetcsv($handle, 1000, ",")) !== FALSE){}' 示例)

标签: php


【解决方案1】:

如果一切都失败了,您可以随时查看 PHP 源代码。我不是这方面的专家,但看起来fgetcsv() 函数的工作原理在文件/ext/spl/internal/splfileobject.inc 的第 77 行附近进行了描述。这是 GitHub 存储库的链接:

https://github.com/php/php-src/blob/master/ext/spl/internal/splfileobject.inc#L77

【讨论】:

  • 链接已失效
猜你喜欢
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 2020-11-06
  • 2018-10-30
相关资源
最近更新 更多