如果您正在讀取的檔案是 CSV 格式,請不要使用 file(),請使用 fgetcsv()。 file() 會根據找到的每個換行符號分割檔案,即使換行符號出現在欄位內(例如引號內)。
(PHP 4, PHP 5, PHP 7, PHP 8)
file — 將整個檔案讀入陣列
filename
檔案路徑。
如果已啟用 fopen wrappers,則可以使用 URL 作為此函式的檔名。有關如何指定檔名的更多詳細資訊,請參閱 fopen()。有關各種 wrappers 的功能、使用說明以及它們可能提供的任何預定義變數的資訊連結,請參閱 支援的協定和 Wrappers。
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 電腦建立或在 Macintosh 電腦上建立的檔案時無法正確識別行尾,啟用 auto_detect_line_endings 執行時設定選項可能有助於解決此問題。
版本 | 說明 |
---|---|
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://
通訊端時,開發人員有責任偵測並抑制此警告。
如果您正在讀取的檔案是 CSV 格式,請不要使用 file(),請使用 fgetcsv()。 file() 會根據找到的每個換行符號分割檔案,即使換行符號出現在欄位內(例如引號內)。
要寫入檔案的所有行,換句話說,要逐行讀取檔案,您可以這樣寫程式碼
<?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 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 資料讀入陣列
... 以及其他檔案處理方法
^
請注意,使用 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);