Đọc từng dòng của tệp txt đến phần tử mảng mới


118

Tôi đang cố gắng đọc từng dòng của tệp văn bản thành một mảng và đặt mỗi dòng trong một phần tử mới.
Mã của tôi cho đến nay.

<?php
$file = fopen("members.txt", "r");
$i = 0;
while (!feof($file)) {

$line_of_text = fgets($file);
$members = explode('\n', $line_of_text);
fclose($file);

?>

1
Có bất kỳ thứ gì được lưu trữ trong mảng với mã của bạn như nó không? Bạn đang gặp vấn đề cụ thể nào?
Chris Bornhoft

1
Cảnh báo: FALSE từ fopen sẽ đưa ra cảnh báo và dẫn đến vòng lặp vô hạn ở đây. php.net/manual/en/ Chức năng.feof.php
Gjermund Dahl

Mặc dù ngày của chuỗi, một chuỗi '\n\'sẽ không bị phát nổ trong khi nó phải là một "\n"để có nó được phân tích cú pháp như một chuỗi thoát.
codekandis

Câu trả lời:


397

Nếu bạn không cần bất kỳ quá trình xử lý đặc biệt nào, điều này sẽ thực hiện những gì bạn đang tìm kiếm

$lines = file($filename, FILE_IGNORE_NEW_LINES);

file()dường như chậm hơn đáng kể so với file_get_contents+ explodethành mảng
Ron

@Ron Tôi đồng ý. Sau đó, một lần nữa, bạn không nên đọc tệp theo cách này theo mọi yêu cầu. Điều đó thật ngớ ngẩn, ngay cả khi giải pháp là tối ưu. Nội dung của tệp phải được lưu trữ trên bộ nhớ đệm hoặc thậm chí trong cơ sở dữ liệu. Ngay cả PHP cũng lưu trữ nội dung của các tệp đã được phân tích cú pháp. Ý tôi là, chúng ta còn xa với PHP 4.3
Yanick Rochon

35

Cách nhanh nhất mà tôi đã tìm thấy là:

// Open the file
$fp = @fopen($filename, 'r'); 

// Add each line to an array
if ($fp) {
   $array = explode("\n", fread($fp, filesize($filename)));
}

trong đó $ filename sẽ là đường dẫn & tên tệp của bạn, ví dụ. ../filename.txt.

Tùy thuộc vào cách bạn thiết lập tệp văn bản của mình, bạn có thể phải thử với \ n bit.


1
Tôi sẽ sử dụng "PHP_EOL" thay vì "\ n", điều này trông giống như vậy, $ array = boom (PHP_EOL, fread ($ fp, filesize ($ filename)));
Fabian Harmsen

Cảm ơn Drew, sau khi thử nhiều chức năng, chức năng của bạn là chức năng duy nhất hoạt động. Cụm từ tìm kiếm của tôi là <br> thay vì \ n của bạn. Tệp của tôi chỉ được đọc dưới dạng một mảng giá trị lớn duy nhất, toàn bộ văn bản chỉ là một mục mảng $ myarr [0], vì vậy việc xáo trộn không hoạt động trên một mục duy nhất. Hy vọng nó sẽ giúp ai đó. Cảm ơn một lần nữa.
washere

27

Chỉ cần sử dụng cái này:

$array = explode("\n", file_get_contents('file.txt'));

26
$yourArray = file("pathToFile.txt", FILE_IGNORE_NEW_LINES);

FILE_IGNORE_NEW_LINEStránh để thêm dòng mới vào cuối mỗi phần tử mảng
Bạn cũng có thể sử dụng FILE_SKIP_EMPTY_LINESđể Bỏ qua các dòng trống

tham khảo tại đây


23
<?php
$file = fopen("members.txt", "r");
$members = array();

while (!feof($file)) {
   $members[] = fgets($file);
}

fclose($file);

var_dump($members);
?>

1
Được rồi, tôi có nó hoạt động hoàn hảo cảm ơn. Tuy nhiên, tôi cần đặt vaiable = thành một phần tử mảng. $ var = $ ary [1]; không hoạt động. ary [1] = "thử nghiệm". Nếu điều đó có ích.
Dan

1
Tự chạy bộ đếm và đặt chỉ mục trong mảng
Prasad

7
$lines = array();
while (($line = fgets($file)) !== false)
    array_push($lines, $line);

Rõ ràng, trước tiên bạn sẽ cần tạo một trình xử lý tệp và lưu trữ nó vào $file.


7

Nó chỉ dễ dàng như vậy:

$lines = explode("\n", file_get_contents('foo.txt'));

file_get_contents() - nhận toàn bộ tệp dưới dạng chuỗi.

explode("\n")- sẽ chia chuỗi bằng dấu phân cách "\n"- lối thoát ASCII-LF cho một dòng mới là gì.

Nhưng hãy chú ý - kiểm tra xem tệp có UNIX không phần cuối là Line hay không.

nếu "\n"nó không hoạt động bình thường, bạn có một mã hóa khác là 2 dòng mới và bạn có thể thử "\r\n", "\r"hoặc"\025"


3
$file = __DIR__."/file1.txt";
$f = fopen($file, "r");
$array1 = array();

while ( $line = fgets($f, 1000) )
{
    $nl = mb_strtolower($line,'UTF-8');
    $array1[] = $nl;
}

print_r($array);

1

Bạn đã đi đúng hướng, nhưng có một số vấn đề với mã bạn đã đăng. Trước hết, không có dấu ngoặc đóng cho vòng lặp while. Thứ hai, $ line_of_text sẽ bị ghi đè với mỗi lần lặp lại vòng lặp, điều này được khắc phục bằng cách thay đổi dấu = thành a. = Trong vòng lặp. Thứ ba, bạn đang giải thích các ký tự chữ '\ n' chứ không phải một dòng mới thực sự; trong PHP, dấu ngoặc kép sẽ biểu thị các ký tự chữ, nhưng dấu ngoặc kép sẽ thực sự diễn giải các ký tự và biến thoát.

    <?php
        $file = fopen("members.txt", "r");
        $i = 0;
        while (!feof($file)) {
            $line_of_text .= fgets($file);
        }
        $members = explode("\n", $line_of_text);
        fclose($file);
        print_r($members);
    ?>

1
    $file = file("links.txt");
print_r($file);

Điều này sẽ chấp nhận tệp txt dưới dạng mảng. Vì vậy, hãy viết bất cứ thứ gì vào tệp links.txt (sử dụng một dòng cho một phần tử) sau khi chạy trang này :) mảng của bạn sẽ là $ tệp


0

Điều này đã được đề cập ở đây khá tốt, nhưng nếu bạn THỰC SỰ cần hiệu suất tốt hơn bất kỳ thứ gì được liệt kê ở đây, bạn có thể sử dụng cách tiếp cận này strtok.

$Names_Keys = [];
$Name = strtok(file_get_contents($file), "\n");
while ($Name !== false) {
    $Names_Keys[$Name] = 0;
    $Name = strtok("\n");
}

Lưu ý, điều này giả sử tệp của bạn được lưu với \n dưới dạng ký tự dòng mới (bạn có thể cập nhật khi cần thiết) và nó cũng lưu trữ các từ / tên / dòng dưới dạng các khóa mảng thay vì các giá trị, do đó bạn có thể sử dụng nó như một bảng tra cứu, cho phép sử dụng isset(nhanh hơn nhiều), thay vì in_array.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.