2024年PHP开发者大会日本站

file

(PHP 4, PHP 5, PHP 7, PHP 8)

file将整个文件读取到数组中

描述

file(string $filename, int $flags = 0, ?resource $context = null): array|false

将整个文件读取到数组中。

注意:

可以使用 file_get_contents() 将文件内容作为字符串返回。

参数

filename

文件路径。

提示

如果启用了 fopen 封装器,则可以使用 URL 作为此函数的文件名。有关如何指定文件名的更多详细信息,请参阅 fopen()。请参阅 支持的协议和封装器,了解各种封装器的功能、用法说明以及它们可能提供的任何预定义变量的信息。

flags

可选参数 flags 可以是一个或多个以下常量

FILE_USE_INCLUDE_PATH
include_path 中搜索文件。
FILE_IGNORE_NEW_LINES
省略每个数组元素末尾的换行符
FILE_SKIP_EMPTY_LINES
跳过空行
FILE_NO_DEFAULT_CONTEXT
不要使用默认上下文

context

一个 上下文流 resource

返回值

返回一个包含文件内容的数组。数组的每个元素对应于文件中的每一行,换行符仍然附加在后面。如果失败,file() 返回 false

注意:

结果数组中的每一行都将包含行尾,除非使用了 FILE_IGNORE_NEW_LINES

注意: 如果PHP在读取Macintosh计算机上或由其创建的文件时无法正确识别换行符,则启用 auto_detect_line_endings 运行时配置选项可能有助于解决此问题。

错误/异常

从PHP 8.3.0开始,如果flags包含任何无效值,例如FILE_APPEND,则会抛出ValueError

如果文件不存在,则发出E_WARNING级别的错误。

变更日志

版本 描述
8.3.0 对于flags的任何无效值,都会抛出ValueError

范例

示例 #1 file() 示例

<?php
// 将文件读取到数组中。在这个例子中,我们将通过HTTP获取
// URL的HTML源代码。
$lines = file('http://www.example.com/');

// 循环遍历我们的数组,显示HTML源代码;并显示行号。
foreach ($lines as $line_num => $line) {
echo
"Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}

// 使用可选的flags参数
$trimmed = file('somefile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
?>

备注

警告

使用SSL时,Microsoft IIS会违反协议,在不发送close_notify指示器的情况下关闭连接。当您到达数据末尾时,PHP会将其报告为“SSL:致命协议错误”。为了解决这个问题,error_reporting的值应该降低到不包含警告的级别。当您使用https://包装器打开流时,PHP可以检测到有问题的IIS服务器软件,并将抑制警告。当使用fsockopen()创建ssl://套接字时,开发者负责检测和抑制此警告。

参见

添加注释

用户贡献的注释 7 条注释

32
Martin K.
10年前
如果您读取的文件是CSV格式,请不要使用file(),请使用fgetcsv()。file()会根据找到的每个换行符分割文件,即使换行符出现在字段内(即在引号内)。
22
bingo at dingo dot com
11年前
换句话说,要逐行读取文件并写入所有行,您可以这样编写代码
<?php
$names
=file('name.txt');
// 检查行数
echo count($names).'<br>';
foreach(
$names as $name)
{
echo
$name.'<br>';
}
?>

这个例子非常基础,有助于理解其工作原理。我希望它能帮助许多初学者。

此致,
Bingo
15
d basin
15年前
这可能很明显,但我花了一段时间才找出自己错在哪里。所以我想分享一下。我的“C:\”驱动器上有一个文件。如何使用file()函数读取它?

不要忘记反斜杠是特殊字符,你必须对其进行“转义”,即使用“\\”。

<?php

$lines
= file("C:\\Documents and Settings\\myfile.txt");

foreach(
$lines as $line)
{
echo(
$line);
}

?>

希望这有帮助……
9
twichi at web dot de
13年前
将CSV数据(文件)读取到带有命名键的数组中

…第一行是否作为标题(键)
(参见函数调用的第四个参数为true/false)

<?php
// --------------------------------------------------------------

function csv_in_array($url,$delm=";",$encl="\"",$head=false) {

$csvxrow = file($url); // ---- 将csv行读入数组 ----

$csvxrow[0] = chop($csvxrow[0]);
$csvxrow[0] = str_replace($encl,'',$csvxrow[0]);
$keydata = explode($delm,$csvxrow[0]);
$keynumb = count($keydata);

if (
$head === true) {
$anzdata = count($csvxrow);
$z=0;
for(
$x=1; $x<$anzdata; $x++) {
$csvxrow[$x] = chop($csvxrow[$x]);
$csvxrow[$x] = str_replace($encl,'',$csvxrow[$x]);
$csv_data[$x] = explode($delm,$csvxrow[$x]);
$i=0;
foreach(
$keydata as $key) {
$out[$z][$key] = $csv_data[$x][$i];
$i++;
}
$z++;
}
}
else {
$i=0;
foreach(
$csvxrow as $item) {
$item = chop($item);
$item = str_replace($encl,'',$item);
$csv_data = explode($delm,$item);
for (
$y=0; $y<$keynumb; $y++) {
$out[$i][$y] = $csv_data[$y];
}
$i++;
}
}

return
$out;
}

// --------------------------------------------------------------

?>

函数调用,带有4个参数

(1) = 包含CSV数据的文件(URL/字符串)
(2) = 列分隔符(例如:; 或 | 或 , …)
(3) = 值包含在(例如:' 或 " 或 ^ 或 …)
(4) = 第一行是否为标题 (true/false)

<?php

// ----- 调用 ------
$csvdata = csv_in_array( $yourcsvfile, ";", "\"", true );
// -----------------

// ----- 查看 ------
echo "<pre>\r\n";
print_r($csvdata);
echo
"</pre>\r\n";
// -----------------

?>

PS: 也请参考:https://php.net/manual/de/function.fgetcsv.php 用于将CSV数据读取到数组中
…以及其他文件处理方法

^
0
radler63 at hotmail dot com
6年前
我的经验是,如果文件已更改,则函数file()会使用缓存内容……
-2
renanlazarotto at gmail dot com
3年前
请注意,使用file()来计算行数可能会导致服务器内存溢出(OOM),因为它会将所有行分配到一个数组中。

如果您处理的文件可能包含数千行,那么SplFileObject可能是一个更好的选择,只需少量更改即可获得相同的结果。
-5
sheldon at hyperlinked dot com
5年前
从PHP 5.6开始,如果引用的源URL没有有效的SSL证书,则file()、file_get_contents()和fopen()函数将返回false。大概在你的开发环境中你会经常遇到这种情况,这会让你抓狂。

你需要创建一个流上下文并将其作为参数提供给各种文件操作,以指示它忽略无效的SSL证书。

$args = array("ssl"=>array("verify_peer"=>false,"verify_peer_name"=>false),"http"=>array('timeout' => 60, 'user_agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/3.0.0.1'));

$context = stream_context_create($args);
$httpfile = file($url, false, $context);
To Top