PHP 从文件中读取第一行的最快捷的方法

回答 11 浏览 7.9万 2010-12-23

有什么最快、最简单的方法可以从一个文件中只读取第一行?我知道你可以使用file,但在我的情况下,没有必要浪费时间来加载整个文件。

最好是一个单行本。

Jonah 提问于2010-12-23
不知道这是否可行(只读取文件的第一行,而不加载任何"额外内容")。yoda 2010-12-23
也许是像$buffer = '';while(strpos($buffer, "\n")===false){$buffer .= fread($handle, 16);} $string = substr($buffer, 0, strpos($buffer, "\n"));这样的东西Jonah 2010-12-23
$line = (new SplFileObject($file))->fgets(); - 从 PHP 5.4.0 开始,可以使用花式构造和调用方法的语法。salathe 2013-03-26
11 个回答
#1楼 已采纳
得票数 145

好吧,你可以这样做。

$f = fopen($file, 'r');
$line = fgets($f);
fclose($f);

这不是一行,但如果你把它变成一行,你要么就会被错误检查搞砸,要么就会使资源开放的时间超过你所需要的时间,所以我说要保持多行。

编辑部

如果你ABSOLUTELY知道文件的存在,你可以使用一个单行代码。

$line = fgets(fopen($file, 'r'));

原因是,PHP为资源实现了RAII

这意味着,当文件句柄超出范围时(在这种情况下,在调用fgets后立即发生),它将被关闭。

ircmaxell 提问于2010-12-23
ircmaxell 修改于2015-02-11
为了避免出现不需要的\n,你可能想在单行本中添加trim()Trendfischer 2016-07-27
#2楼
得票数 26
$firstline=`head -n1 filename.txt`;
profitphp 提问于2010-12-23
linux ftw.我猜作为唯一的一个衬垫还不足以得到答案的投票......该死的微软!!!"。profitphp 2010-12-23
一句话可能就够了,但一个完全不适合新手的答案就不行了。代码可能很好,但如果有人需要这样的答案,他/她可能不了解PHP,就像他/她的靴子一样--我使用PHP已经10年了,但不知道你这一行是如何/为什么工作的,因此绝不会在我的代码中使用它。解释一下就好了。Kalko 2020-03-18
@Kalko, 后缀是在php中执行字符串作为一个shell命令 php.net/manual/en/function.shell-exec.phpssi-anik 2020-08-07
@ssi-anik 该死,我不知道。谢谢你的解释。我建议你把这个解释加到答案本身,这样更多的人就会明白。Kalko 2020-08-10
这种方法有两个问题:1/问题是关于最快速的方法,但回车操作意味着严重的开销。2/ 如果你使用"head"unix系统命令,你的代码将不能再被移植。ThatsMe 2021-12-02
#3楼
得票数 10

我印象深刻的是,没有人提到file()函数。

$line = file($filename)[0];

或者如果 version_compare(PHP_VERSION, "5.4.0") < 0:

$line = array_shift(file($filename));
Tarjei Huse 提问于2014-03-21
"我知道你可以使用file,但在我的情况下,没有必要浪费时间加载整个文件。 :-)Jonah 2014-03-25
#4楼
得票数 8
$line = '';
$file = 'data.txt';
if($f = fopen($file, 'r')){
  $line = fgets($f); // read until first newline
  fclose($f);
}
echo $line;
Sarah 提问于2010-12-23
#5楼
得票数 4

在现代的PHP中使用SplFileObject

$fileObject = new \SplFileObject('myfile');
$line = $fileObject->current();

补充性资料

使用SplFileObject,也很容易寻找行数,例如跳过2行。

$fileObject = new \SplFileObject('myfile');

$fileObject->seek(2);
$line = $fileObject->current();

或阅读前10行。

$fileObject = new \SplFileObject('myfile');

$lines = '';
for ($i = 0; $i < 10 && $fileObject->valid(); ++$i) {
    $lines .= $fileObject->getCurrentLine();
}

注意getCurrentLine()将读取当前行并将内部光标移至下一行(基本上是current()+next())。

Fabien Sa 提问于2021-01-13
Fabien Sa 修改于2022-08-19
current()getCurrentLine()之间有什么区别吗?matronator 2022-08-18
@matronator getCurrentLine()fgets()的别名;它'类似,但它会在内部将光标移动到下一行,本质上是current() + next()。我添加了一个注释。Fabien Sa 2022-08-19
#6楼
得票数 3
if(file_exists($file)) {
    $line = fgets(fopen($file, 'r'));
}
Mateusz Bacławski 提问于2018-01-11
#7楼
得票数 1

fgets()返回" ",这是最后的一个新行,但使用这段代码,你将得到第一行,而没有最后的换行。

$handle = @fopen($filePath, "r");
$text=fread($handle,filesize($filePath));
$lines=explode(PHP_EOL,$text);
$line = reset($lines);
George SEDRA 提问于2018-03-15
#8楼
得票数 0

你可以尝试使用fread,并声明要读取的文件大小。

ngen 提问于2010-12-23
#9楼
得票数 0

在我的一个项目(qSandbox)中,我使用这种方法来获取一个文本文件的第一行,无论如何我都会阅读。 我的电子邮件模板是在一个文本文件中,主题在第一行。

$subj_regex = '#^\s*(.+)[\r\n]\s*#i';

// subject is the first line of the text file. Smart, eh?
if (preg_match($subj_regex, $buff, $matches)) {
    $subject = $matches[1];
    $buff = preg_replace($subj_regex, '', $buff); // rm subject from buff now.
}
Svetoslav Marinov 提问于2014-07-20
#10楼
得票数 -1

如果你不介意在整个文件中阅读,那么一个单行本就可以了。

$first_line = array_shift(array_values(preg_split('/\r\n|\r|\n/', file_get_contents($file_path), 2)));

:)

rcourtna 提问于2013-01-03
叙述。在我的情况下,没有必要浪费时间去加载整个文件YakovL 2018-10-17
#11楼
得票数 -8

尝试一下这个。

$file = 'data.txt';
$data = file_get_contents($file);
$lines = explode
MisterFrogger 提问于2014-01-06
你的答案是不完整的。chanchal118 2014-01-06
标签