2024 年 PHP Conference Japan

file

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

file將整個檔案讀入陣列

說明

file()(字串 $filename, 整數 $flags = 0, ?資源 $context = null): 陣列|false

將整個檔案讀入陣列。

注意事項:

您可以使用 file_get_contents() 將檔案內容作為字串返回。

參數

filename

檔案路徑。

提示

如果已啟用 fopen wrappers,則可以使用 URL 作為此函式的檔名。有關如何指定檔名的更多詳細資訊,請參閱 fopen()。有關各種 wrappers 的功能、使用說明以及它們可能提供的任何預定義變數的資訊連結,請參閱 支援的協定和 Wrappers

flags

可選參數 flags 可以是一個或多個以下常數

FILE_USE_INCLUDE_PATH
include_path 中搜尋檔案。
FILE_IGNORE_NEW_LINES
省略每個陣列元素結尾的換行符號
FILE_SKIP_EMPTY_LINES
跳過空行
FILE_NO_DEFAULT_CONTEXT
不使用預設上下文

context

串流上下文 資源

返回值

以陣列形式返回檔案。陣列的每個元素對應於檔案中的一行,換行符號仍然附加。失敗時,file() 返回 false

注意事項:

除非使用 FILE_IGNORE_NEW_LINES,否則結果陣列中的每一行都將包含行尾。

注意如果 PHP 在讀取由 Macintosh 電腦建立或在 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 原始碼顯示為 HTML 原始碼,並顯示行號。
foreach ($lines as $line_num => $line) {
echo
"行 #<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 rows to array ----

$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 資料的檔案(網址 / 字串)
(2)= 欄位分隔符號(例如:; 或 | 或 , ...)
(3)= 值的括號(例如:' 或 " 或 ^ 或 ...)
(4)= 有或沒有第一列作為標題(true/false)

<?php

// ----- 呼叫 ------
$csvdata = csv_in_array( $yourcsvfile, ";", "\"", true );
// -----------------

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

?>

備註:另請參閱: https://php.dev.org.tw/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