【发布时间】:2012-02-03 08:27:40
【问题描述】:
我正在尝试从文本文件中读取数据并将其分配给数组。我怎样才能一次准确地读取 3 行,然后将第一行分配给数组 $a,第二行分配给数组 $b,第三行分配给数组 $c?然后再读 3 行,等等。
【问题讨论】:
-
使用 fgets -> php.net/manual/en/function.fgets.php
我正在尝试从文本文件中读取数据并将其分配给数组。我怎样才能一次准确地读取 3 行,然后将第一行分配给数组 $a,第二行分配给数组 $b,第三行分配给数组 $c?然后再读 3 行,等等。
【问题讨论】:
$lines = file('some_file.txt');
$numLines = count($lines);
for ($i = 0; $i < $numLines; $i += 3) {
$a[] = $lines[$i];
$b[] = $lines[$i + 1];
$c[] = $lines[$i + 2];
}
请注意,您还需要进行一些越界索引错误检查。我把它作为 OP 的练习。
【讨论】:
fgets从文件中流式传输数据而不是缓冲它...
fgets 的例子应该会给你一些想法:
http://php.net/manual/en/function.fgets.php#refsect1-function.fgets-examples
【讨论】:
你可以使用这样的例子:
$lines = file('filename');
$chunks_array = array_chunk($lines, 3)); - this create array of arrays with 3 lines each
foreach ($chunks_array as $chunks)
{
$a[] = $chunks[0];
$b[] = $chunks[1];
$c[] = $chunks[2];
}
【讨论】:
曾经我遇到过类似的问题。我这样解决(在伪代码中)。
counter = 1;
while reading
switch counter
case 1: store in the first array then break;
case 2: store in the second array then break;
case 3: store in the third array, counter = 0, then break;
counter++;
end-while
【讨论】:
您可以使用 fseek 或 file_get_contents 与 maxlen 参数。但是要准确地阅读 3 行,我实际上并不知道,除非你知道这些行有多长。
函数file 将所有行读入一个数组。
编辑两个:
可以逐字节读取文件(尽管从我的角度来看这是一个坏主意)并在遇到每个 \n 或 PHP_EOL 并使用计数器或其他任何东西来管理它的使用方式后停止。
编辑一个:
我刚刚有了这个想法:您可以创建一个自定义流包装器,并用它来处理您读取的 3 行 3 行。它是一个很棒的文件工具,检查http://www.php.net/manual/en/class.streamwrapper.php,并通过上下文或变量或其他方式控制它。
我猜你仍然需要为此找到一个算法。我还没有尝试过,但如果你能处理,请告诉我们。
【讨论】: