如果您读取的文件是CSV格式,请不要使用file(),请使用fgetcsv()。file()会根据找到的每个换行符分割文件,即使换行符出现在字段内(即在引号内)。
(PHP 4, PHP 5, PHP 7, PHP 8)
file — 将整个文件读取到数组中
filename
文件路径。
flags
可选参数 flags
可以是一个或多个以下常量
FILE_USE_INCLUDE_PATH
FILE_IGNORE_NEW_LINES
FILE_SKIP_EMPTY_LINES
FILE_NO_DEFAULT_CONTEXT
context
返回一个包含文件内容的数组。数组的每个元素对应于文件中的每一行,换行符仍然附加在后面。如果失败,file() 返回 false
。
注意:
结果数组中的每一行都将包含行尾,除非使用了
FILE_IGNORE_NEW_LINES
。
注意: 如果PHP在读取Macintosh计算机上或由其创建的文件时无法正确识别换行符,则启用 auto_detect_line_endings 运行时配置选项可能有助于解决此问题。
版本 | 描述 |
---|---|
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://
套接字时,开发者负责检测和抑制此警告。
换句话说,要逐行读取文件并写入所有行,您可以这样编写代码
<?php
$names=file('name.txt');
// 检查行数
echo count($names).'<br>';
foreach($names as $name)
{
echo $name.'<br>';
}
?>
这个例子非常基础,有助于理解其工作原理。我希望它能帮助许多初学者。
此致,
Bingo
这可能很明显,但我花了一段时间才找出自己错在哪里。所以我想分享一下。我的“C:\”驱动器上有一个文件。如何使用file()函数读取它?
不要忘记反斜杠是特殊字符,你必须对其进行“转义”,即使用“\\”。
<?php
$lines = file("C:\\Documents and Settings\\myfile.txt");
foreach($lines as $line)
{
echo($line);
}
?>
希望这有帮助……
将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数据读取到数组中
…以及其他文件处理方法
^
请注意,使用file()来计算行数可能会导致服务器内存溢出(OOM),因为它会将所有行分配到一个数组中。
如果您处理的文件可能包含数千行,那么SplFileObject可能是一个更好的选择,只需少量更改即可获得相同的结果。
从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);