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


118

我试图将文本文件的每一行读入一个数组,并将每一行放入一个新元素中。
到目前为止,我的代码。

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

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

?>

1
数组中是否存储了任何代码?您有什么具体问题?
克里斯·伯恩霍夫

1
警告:fopen中的FALSE将发出警告,并在此处导致无限循环。php.net/manual/en/function.feof.php
Gjermund Dahl

尽管线程具有日期,但'\n\'不会被分解,而必须将"\n"其解析为转义序列。
codekandis

Answers:


397

如果您不需要任何特殊处理,应该可以满足您的需求

$lines = file($filename, FILE_IGNORE_NEW_LINES);

file()似乎是相当慢于file_get_contents+ explode到阵列
罗恩

@罗恩,我同意。再说一次,您不应在每次请求时都以这种方式读取文件。即使解决方案是最佳的,这也很愚蠢。文件的内容应该存储在内存缓存中,甚至存储在数据库中。甚至PHP也会存储已解析文件的内容。我的意思是,我们远远没有PHP 4.3
Yanick罗森

35

我发现最快的方法是:

// 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位。


1
我会用“ PHP_EOL”代替“ \ n”,看起来是这样,$ array = explode(PHP_EOL,fread($ fp,filesize($ filename)));
Fabian Harmsen

感谢Drew,在尝试了许多功能之后,您的功能才是唯一起作用的功能。我的搜索词是<br>而不是您的\ n。我的文件仅作为一个大值数组读取,整个文本只是一个数组项$ myarr [0],因此改组对单个项无效。希望它能帮助某人。再次感谢。
washere

27

只需使用此:

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

26
$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
好吧,我让它运行得很好,谢谢。但是,我需要将vaiable =设置为数组元素。$ var = $ ary [1]; 不起作用。ary [1] =“ test”。如果有帮助。

1
自己运行一个计数器并在数组中设置索引
Prasad 2012年

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

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


7

就这么简单:

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

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

explode("\n")-将使用定界符分割字符串"\n"-什么是换行符的ASCII-LF转义。

但是请注意-检查文件是否以UNIX -Line结尾。

如果"\n"无法正常工作,则您还有其他编码为2的换行符,可以尝试使用"\r\n""\r""\025"


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);

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


0

此处已对此进行了很好的介绍,但是,如果您确实确实需要比此处列出的任何产品都更好的性能,则可以使用使用的方法strtok

$Names_Keys = [];
$Name = strtok(file_get_contents($file), "\n");
while ($Name !== false) {
    $Names_Keys[$Name] = 0;
    $Name = strtok("\n");
}

请注意,这假设您的文件另存\n为换行符(可以根据需要进行更新),并且还将单词/名称/行存储为数组键而不是值,以便将其用作查找表,允许使用isset(快得多)而不是in_array

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.