file

(PHP 4, PHP 5)

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에 관한 자세한 설명은 Stream 함수 목록을 참고하십시오.

반환값

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 실행 옵션을 활성화 함으로써 문제가 해결될 수 있습니다.

변경점

버전 설명
5.0.0 The context parameter was added
5.0.0 Prior to PHP 5.0.0 the flags parameter only covered include_path and was enabled with 1
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 12 notes

up
17
twichi at web dot de
3 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
6
d basin
5 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
5
bingo at dingo dot com
1 year 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
0
Martin K.
3 months 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
-1
jon+spamcheck at phpsitesolutions dot com
6 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
-2
Anonymous
11 months 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
-3
Reversed: moc dot liamg at senroc dot werdna
7 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
-5
info at carstanje dot com
7 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);
}
?>
up
-6
andrea at brancatelli dot it
12 years ago
file() has a strange behaviour when reading file with both \n and \r as line delimitator (DOS files), since it will return an array with every single line but with just a \n in the end. It seems like \r just disappears.

This is happening with PHP 4.0.4 for OS/2. Don't know about the Windows version.
up
-6
vbchris at gmail dot com
6 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
-3
marco dot remy at aol dot com
5 months 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
-10
justin at visunet dot ie
11 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().
To Top