LimitIterator 偏移量 1 和 2 个元素
Posted
技术标签:
【中文标题】LimitIterator 偏移量 1 和 2 个元素【英文标题】:LimitIterator offset 1 with 2 elements 【发布时间】:2018-12-06 06:37:37 【问题描述】:我面临的问题是我有一个读取 CSV 文件的 SplFileObject,然后我将它包装到一个 LimitIterator。
CSV 文件有 2 行、标题和 1 行,我将 LimitIterator 偏移量设置为 1,但无法覆盖它,似乎索引存在一些内部问题。
代码如下:
$csvFile = new \SplFileObject($fileName);
$csvFile->setFlags(\SplFileObject::READ_CSV);
$iterator = new \LimitIterator($csvFile, 1);
/** @var \LimitIterator $it */
foreach ($iterator as $it)
list($.., $.., $..) = $it;
$result[] = [
...
];
return $result;
如果 CSV 有 3 行(标题和 2 行),代码运行良好,但只有标题和 1 行,它不起作用。
有什么想法吗?
谢谢。
【问题讨论】:
我用简单的 csv 尝试了你的代码 - 它有效。检查您的数据,是否已损坏? 我可以看看你的简单 CSV 吗?感谢您的帮助 【参考方案1】:就个人而言,我会为此使用 fopen 和 fgetcsv 函数,如下所示;
<?php
$handle = fopen("myFile.csv", "r");
if ($handle != false)
$header_row_handled = false;
while ($datarow = fgetcsv($handle, 0, ",")
if (!$header_row_handled)
$header_row_handled = true;
else
/* Whatever you need */
$dataparta = $datarow[0];
$datapartb = $datarow[1];
$datapartc = $datarow[2];
循环意味着您每次都可以跳过第一行,并且可能会为此使用更少的资源,因为您没有那么多对象漂浮在周围
php.net page 也应该能帮到你
【讨论】:
我想问题不是如何循环数据集。但是为什么某些选定的方法不起作用。 @u_mulder - 嗯,是的,这纯粹是实现相同结果的替代方法 这是我们之前使用的方法,但我正在将其重构为更现代的方法,因此我可以有一些非常简单、可读的内容并删除循环内的条件。 @redigaffi - 有时,重新发明***并不是最好的做法,简单有时很棒,IMO 它归结为“为什么要修复未损坏的东西”:) 是的,我知道这一点,但我总是努力改进所有方面。删除这些条件意味着更简单和更容易的代码。 (而且圈复杂度也更低)。但感谢您的帮助。【参考方案2】:这与 PHP 错误 65601 有关,建议添加 READ_AHEAD
标志将解决此问题。经过测试并按您的预期工作。
$csvFile->setFlags(\SplFileObject::READ_CSV | \SplFileObject::READ_AHEAD);
另见SplFileObject + LimitIterator + offset
【讨论】:
以上是关于LimitIterator 偏移量 1 和 2 个元素的主要内容,如果未能解决你的问题,请参考以下文章