PHP Velho Oeste 2024

file

(PHP 4, PHP 5, PHP 7)

fileReads entire file into an array

설명

array file ( string $filename [, int $flags = 0 [, resource $context ]] )

Reads an entire file into an array.

Note:

You can use file_get_contents() to return the contents of a file as a string.

인수

filename

Path to the file.

Tip

fopen 래퍼를 활성화하면, 파일명으로 URL을 사용할 수 있습니다. 파일 이름을 지정하는 방법은 fopen()을 참고하십시오. 다양한 래퍼의 기능, 사용법, 제공하는 예약 정의 변수들에 대해서는 Supported Protocols and Wrappers를 참고하십시오.

flags

The optional parameter flags can be one, or more, of the following constants:

FILE_USE_INCLUDE_PATH
Search for the file in the include_path.
FILE_IGNORE_NEW_LINES
Do not add newline at the end of each array element
FILE_SKIP_EMPTY_LINES
Skip empty lines

context

A context resource created with the stream_context_create() function.

Note: Context 지원은 PHP 5.0.0에서 추가되었습니다. contexts에 관한 자세한 설명은 Streams을 참고하십시오.

반환값

Returns the file in an array. Each element of the array corresponds to a line in the file, with the newline still attached. Upon failure, file() returns FALSE.

Note:

Each line in the resulting array will include the line ending, unless FILE_IGNORE_NEW_LINES is used, so you still need to use rtrim() if you do not want the line ending present.

Note: PHP가 매킨토시 컴퓨터에서 파일을 읽거나 작성할 때 행의 끝을 판단하지 못하면, auto_detect_line_endings 실행 옵션을 활성화 함으로써 문제가 해결될 수 있습니다.

오류/예외

Emits an E_WARNING level error if the file does not exist.

변경점

버전 설명
4.3.0 file() became binary safe

예제

Example #1 file() example

<?php
// Get a file into an array.  In this example we'll go through HTTP to get
// the HTML source of a URL.
$lines file('http://www.example.com/');

// Loop through our array, show HTML source as HTML source; and line numbers too.
foreach ($lines as $line_num => $line) {
    echo 
"Line #<b>{$line_num}</b> : " htmlspecialchars($line) . "<br />\n";
}

// Another example, let's get a web page into a string.  See also file_get_contents().
$html implode(''file('http://www.example.com/'));

// Using the optional flags parameter since PHP 5
$trimmed file('somefile.txt'FILE_IGNORE_NEW_LINES FILE_SKIP_EMPTY_LINES);
?>

주의

Warning

SSL을 사용할 때, 마이크로소프트 IIS는 close_notify 식별자를 보내지 않은채 접속을 종료하는 프로토콜 오류가 있습니다. PHP는 데이터의 마지막에 도달했을때, 이를 "SSL: Fatal Protocol Error"로 보고합니다. 이를 처리하기 위해서는 error_reporting 레벨에 경고를 포함하지 않도록 해야합니다. PHP 4.3.7 이후는 https:// 래퍼를 통해 스트림을 열 때, 문제가 있는 IIS 서버 소프트웨어를 검출하여 경고를 하지 않습니다. ssl:// 소켓을 만들기 위해 fsockopen()을 사용한다면, 경고를 직접 검출하여 없애야 합니다.

참고

add a note add a note

User Contributed Notes 15 notes

up
29
Martin K.
9 years ago
If the file you are reading is in CSV format do not use file(), use fgetcsv().  file() will split the file by each newline that it finds, even newlines that appear within a field (i.e. within quotations).
up
24
bingo at dingo dot com
10 years ago
To write all the lines of the file in other words to read the file line by line you can write the code like this:
<?php
$names
=file('name.txt');
// To check the number of lines
echo count($names).'<br>';
foreach(
$names as $name)
{
   echo
$name.'<br>';
}
?>

this example is so basic to understand how it's working. I hope it will help many beginners.

Regards,
Bingo
up
13
d basin
14 years ago
this may be obvious, but it took me a while to figure out what I was doing wrong. So I wanted to share. I have a file on my "c:\" drive. How do I file() it?

Don't forget the backslash is special and you have to "escape" the backslash i.e. "\\":

<?php

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

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

?>

hope this helps...
up
10
twichi at web dot de
12 years ago
read from CSV data (file) into an array with named keys

... with or without 1st row = header (keys)
(see 4th parameter of function call as  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;
}

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

?>

fuction call with 4 parameters:

(1) = the file with CSV data (url / string)
(2) = colum delimiter (e.g: ; or | or , ...)
(3) = values enclosed by (e.g: ' or " or ^ or ...)
(4) = with or without 1st row = head (true/false)

<?php

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

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

?>

PS: also see: http://php.net/manual/de/function.fgetcsv.php to read CSV data into an array
... and other file-handling methods

^
up
0
radler63 at hotmail dot com
5 years ago
My experience is that the function file does uses the cached content if the file has changed....
up
-1
renanlazarotto at gmail dot com
3 years ago
Be aware that using file() to count lines can cause OOM on the server as it'll allocate all lines into an array.

If you're dealing with files that can have thousands of lines, SplFileObject might be a better idea and with little changes you can get the same result.
up
-4
sheldon at hyperlinked dot com
4 years ago
As of PHP 5.6 the file(), file_get_contents(), and fopen() functions will return false if you are referencing a source URL that doesn't have a valid SSL certificate. Presumably, you will run into this a lot in your development environments this will drive you crazy.

You will need to create a stream context and provide it as an argument to the various file operations to tell it to ignore invalid SSL credentials.

$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);
up
-10
Reversed: moc dot liamg at senroc dot werdna
16 years ago
This note applies to PHP 5.1.6 under Windows (although may apply to other versions).

It appears that the 'FILE_IGNORE_NEW_LINES' flag doesn't remove newlines properly when reading Windows-style text files, i.e. files whose lines end in '\r\n'.

Solution: Always use 'rtrim()' in preference to 'FILE_IGNORE_NEW_LINES'.
up
-17
Anonymous
10 years ago
("file()'s problem with UTF-16" is wrong. This is updated.
The former may miss the last line of the string.)

file() seems to have a problem in handling
UTF-16 with or without BOM.

file() is likely to think "\n"=LF (0A) as a line-ending.
So, not only "000A" but also "010A, 020A,...,FE0A, FF0A,..."
are regarded as line-endings.

Moreover, file() causes a serious problem in UTF-16LE.
file() loses first "0A" (the first half of "0A00")!
And the next line begins with "00" (the rest of "0A00").
So lines after the first "0A" are totally different.

To avoid this phenomena,
eg. in case (php_script : UTF-8 , file : UTF-16 with line-ending "\r\n"),

<?php

mb_regex_encoding
('UTF-16');    // to help mb_ereg_..() work properly
$str = file_get_contents($file_path);
$to_encoding = 'UTF-16';        // encoding of string
$from_encoding = 'UTF-8';        // encoding of PHP_script
$pattern1 = mb_convert_encoding('[^\r]*\r\n', $to_encoding, $from_encoding);
mb_ereg_search_init($str, $pattern1);
while (
$res = mb_ereg_search_regs()) {
   
$file[] = $res[0];
}
$pattern2 = mb_convert_encoding('\A.*\r\n(.*)\z', $to_encoding, $from_encoding);
mb_ereg($pattern2, $str, $match);
   
$file[] = $match[1];

?>

instead of
$file = file($file_path);

If line-ending is "\n",
$pattern1 = mb_convert_encoding('[^\n]*\n', $to_encoding, $from_encoding);
up
-15
vbchris at gmail dot com
16 years ago
If you're getting "failed to open stream: Permission denied" when trying to use either file() or fopen() to access files on another server. Check your host doesn't have any firewall restrictions in-place which prevent outbound connections. This is the case with my host Aplus.net
up
-18
lanresmith
6 years ago
Using if ( file(name.txt) ) might not be enough for testing if the file was successfully opened for reading because the file could be empty in which case the array returned is empty, so test instead with !==. e.g.:

$file_array = file('test.txt'); // an empty file

echo '<pre>';
if ( $file_array ) {
    # code...
    echo "success\n";
} else {
    # code...
    echo "failure\n"; // executed
}

if ( $file_array !== false ) {
    # code...
    echo "success\n"; // executed
} else {
    # code...
    echo "failure\n";
}
echo '</pre>';

result:
failure
success
up
-20
justin at visunet dot ie
21 years ago
Note: Now that file() is binary safe it is 'much' slower than it used to be. If you are planning to read large files it may be worth your while using fgets() instead of file() For example:

<?php
$fd
= fopen ("log_file.txt", "r");
while (!
feof ($fd))
{
  
$buffer = fgets($fd, 4096);
  
$lines[] = $buffer;
}
fclose ($fd);
?>

The resulting array is $lines.

I did a test on a 200,000 line file. It took seconds with fgets()  compared to minutes with file().
up
-18
jon+spamcheck at phpsitesolutions dot com
16 years ago
A user suggested using rtrim always, due to the line ending conflict with files that have an EOL that differs from the server EOL.

Using rtrim with it's default character replacement is a bad solution though, as it removes all whitespace in addition to the '\r' and '\n' characters.

A good solution using rtrim follows:

<?php
$line
= rtrim($line, "\r\n") . PHP_EOL;
?>

This removes only EOL characters, and replaces with the server's EOL character, thus making preg_* work fine when matching the EOL ($)
up
-20
marco dot remy at aol dot com
9 years ago
Here's my CSV converter
supports Header and trims all fields
Note: Headers must be not empty!

<?php

function csv2array($file, $delim = ';', $encl = '"', $header = false) {
   
   
# File does not exist
   
if(!file_exists($file))
        return
false;
   
   
# Read lines of file to array
   
$file_lines = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
   
   
# Empty file
   
if($file_lines === array())
        return
NULL;
   
   
# Read headers if you want to
   
if($header === true) {
       
$line_header = array_shift($file_lines);
       
$array_header = array_map('trim', str_getcsv($line_header, $delim, $encl));
    }

   
$out = NULL;

   
# Now line per line (strings)
   
foreach ($file_lines as $line) {
       
# Skip empty lines
       
if(trim($line) === '')
            continue;
       
       
# Convert line to array
       
$array_fields = array_map('trim', str_getcsv($line, $delim, $encl));
       
       
# If header present, combine header and fields as key => value
       
if($header === true)
           
$out[] = array_combine ($array_header, $array_fields);
        else
           
$out[] = $array_fields;
    }
   
    return
$out;
}
?>
up
-45
info at carstanje dot com
17 years ago
Using file() for reading large text files > 10 Mb gives problems, therefore you should use this instead. It is much slower but it works fine. $lines will return an array with all the lines.

<?php
$handle
= @fopen('yourfile...', "r");
if (
$handle) {
   while (!
feof($handle)) {
      
$lines[] = fgets($handle, 4096);
   }
  
fclose($handle);
}
?>
To Top