读取txt文件的每一行到新的数组元素中

139

我想将文本文件的每一行读入一个数组,并让每一行都在一个新元素中。
到目前为止,我的代码如下。

<?php
$file = fopen("members.txt", "r");
while (!feof($file)) {

$line_of_text = fgets($file);
$members = explode('\n', $line_of_text);
fclose($file);

?>

1
你的代码中是否存储了任何数组内容?你遇到了什么具体问题? - Chris Bornhoft
2
警告:fopen返回FALSE将发出警告并导致此处的无限循环。http://php.net/manual/zh/function.feof.php - Gjermund Dahl
尽管该线程的日期上含有 '\n\',但它不会被解析为转义序列,必须使用 "\n" 以便正确解析。 - codekandis
12个回答

426
如果您不需要任何特殊处理,这个应该能够满足您的要求。
$lines = file($filename, FILE_IGNORE_NEW_LINES);

2
file() 似乎比 file_get_contents + explode 转换为数组要慢得多。 - Ron
3
@Ron 我同意。不过,你不应该每次请求都这样读取文件。即使解决方案是最优的,这也很愚蠢。文件内容应该存储在内存缓存中,甚至可以存储在数据库中。就算是PHP也会存储解析后的文件内容。我的意思是,我们已经远离了PHP 4.3的时代。 - Yanick Rochon

46

我发现最快的方法是:

// Open the file
$fp = @fopen($filename, 'r'); 

// Add each line to an array
if ($fp) {
   $array = explode("\n", fread($fp, filesize($filename)));
}

$filename是你的文件的路径和名称,例如:../filename.txt。

根据您设置文本文件的方式,您可能需要调整 \n 部分。


6
建议使用"PHP_EOL"代替"\n",这样会更清晰。代码示例:$array = explode(PHP_EOL, fread($fp, filesize($filename))); - LFS96
谢谢Drew,经过尝试了许多函数后,只有你的函数有效。我的搜索项是<br>而不是你的\n。我的文件被读取为一个单一的大值数组,整个文本只是一个数组项$myarr[0],所以在单个项上洗牌是无效的。希望能对某些人有所帮助。再次感谢。 - washere

37

只需使用此代码:

$array = explode("\n", file_get_contents('file.txt'));

30
$yourArray = file("pathToFile.txt", FILE_IGNORE_NEW_LINES);

FILE_IGNORE_NEW_LINES选项可以避免在每个数组元素末尾添加换行符
您还可以使用FILE_SKIP_EMPTY_LINES选项来跳过空行

参考这里


23
<?php
$file = fopen("members.txt", "r");
$members = array();

while (!feof($file)) {
   $members[] = fgets($file);
}

fclose($file);

var_dump($members);
?>

1
好的,我已经完美地解决了它,谢谢。但是我需要将一个变量设置为数组元素。$var = $ary[1]; 不起作用。ary[1] = "test"。如果这有帮助的话。 - Dan
1
自己运行一个计数器并在数组中设置索引。 - Prasad
为什么 while(!feof($file)) 是错误的? - Barmar

13

就是这么简单:

$lines = explode("\n", file_get_contents('foo.txt'));

file_get_contents() - 获取整个文件作为字符串。

explode("\n") - 将字符串使用分隔符"\n"拆分 - 这是换行符的ASCII-LF转义。

但要注意 - 检查文件是否具有UNIX行结尾。

如果"\n"无法正常工作,则可以尝试其他换行符编码,例如"\r\n""\r""\025"


7
$lines = array();
while (($line = fgets($file)) !== false)
    array_push($lines, $line);

显然,您需要先创建一个文件句柄并将其存储在$file中。

3
$file = __DIR__."/file1.txt";
$f = fopen($file, "r");
$array1 = array();

while ( $line = fgets($f, 1000) )
{
    $nl = mb_strtolower($line,'UTF-8');
    $array1[] = $nl;
}

print_r($array);

1
你的思路是正确的,但是你发布的代码存在一些问题。首先,while循环没有闭合括号。其次,$line_of_text会在每次循环迭代中被覆盖,这可以通过在循环中将=更改为.=来解决。第三,你正在分割字面上的字符'\n'而不是实际的换行符;在PHP中,单引号表示字面上的字符,但双引号会实际解释转义字符和变量。
    <?php
        $file = fopen("members.txt", "r");
        $i = 0;
        while (!feof($file)) {
            $line_of_text .= fgets($file);
        }
        $members = explode("\n", $line_of_text);
        fclose($file);
        print_r($members);
    ?>

1
    $file = file("links.txt");
print_r($file);

这将接受文本文件作为数组。因此,在links.txt文件中写入任何内容(每个元素一行),然后运行此页面 :) 您的数组将是$file。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接