อ่านแต่ละบรรทัดของไฟล์ txt ไปยังองค์ประกอบอาร์เรย์ใหม่


118

ฉันพยายามอ่านไฟล์ข้อความทุกบรรทัดลงในอาร์เรย์และให้แต่ละบรรทัดในองค์ประกอบใหม่
รหัสของฉันจนถึงตอนนี้

<?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
มีอะไรเก็บไว้ในอาร์เรย์ด้วยรหัสของคุณหรือไม่? คุณมีปัญหาอะไร?
Chris Bornhoft

1
คำเตือน: FALSE จาก fopen จะออกคำเตือนและส่งผลให้วนซ้ำไม่สิ้นสุดที่นี่ php.net/manual/en/function.feof.php
Gjermund Dahl

แม้จะมีวันที่ของเธรด แต่'\n\'จะไม่ระเบิดในขณะที่ต้อง"\n"แยกวิเคราะห์เป็นลำดับการหลีกเลี่ยง
codekandis

คำตอบ:


396

หากคุณไม่ต้องการการประมวลผลพิเศษใด ๆสิ่งนี้ควรทำในสิ่งที่คุณกำลังมองหา

$lines = file($filename, FILE_IGNORE_NEW_LINES);

file()ดูเหมือนว่าจะช้ากว่าอาร์เรย์file_get_contents+ ค่อนข้างมากexplode
รอน

@ รอนฉันเห็นด้วย จากนั้นอีกครั้งคุณไม่ควรอ่านไฟล์ด้วยวิธีนี้ทุกครั้งที่มีการร้องขอ นั่นเป็นเรื่องโง่แม้ว่าวิธีแก้ปัญหาจะดีที่สุด เนื้อหาของไฟล์ควรเก็บไว้ในแคชหน่วยความจำหรือแม้กระทั่งในฐานข้อมูล แม้แต่ PHP ก็เก็บเนื้อหาของไฟล์ที่แยกวิเคราะห์ ฉันหมายความว่าเราอยู่ไกลจาก PHP 4.3
Yanick Rochon

35

วิธีที่เร็วที่สุดที่ฉันพบคือ:

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

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

โดยที่ $ filename จะเป็นพา ธ & ชื่อไฟล์ของคุณเช่น ../filename.txt

ขึ้นอยู่กับว่าคุณตั้งค่าไฟล์ข้อความอย่างไรคุณอาจต้องเล่นกับ \ n บิต


1
ฉันจะใช้ "PHP_EOL" แทน "\ n" หน้าตาแบบนี้ $ array = Explode (PHP_EOL, fread ($ fp, filesize ($ filename)));
Fabian Harmsen

ขอบคุณ Drew หลังจากลองใช้ฟังก์ชั่นมากมายคุณเป็นคนเดียวที่ใช้งานได้ ข้อความค้นหาของฉันเป็น <br> แทนที่จะเป็นของคุณ \ n ไฟล์ของฉันถูกอ่านเป็นเพียงอาร์เรย์ขนาดใหญ่ค่าเดียวข้อความทั้งหมดเป็นเพียงอาร์เรย์รายการเดียว $ myarr [0] ดังนั้นการสับเปลี่ยนจึงไม่สามารถใช้ได้กับรายการเดียว หวังว่ามันจะช่วยใครบางคน ขอบคุณอีกครั้ง.
washere


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

FILE_IGNORE_NEW_LINESหลีกเลี่ยงการขึ้นบรรทัดใหม่ที่ส่วนท้ายของแต่ละองค์ประกอบอาร์เรย์
นอกจากนี้คุณยังสามารถใช้FILE_SKIP_EMPTY_LINESเพื่อข้ามบรรทัดว่างได้

อ้างอิงที่นี่


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

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

fclose($file);

var_dump($members);
?>

1
โอเคฉันทำงานได้อย่างสมบูรณ์ขอบคุณ อย่างไรก็ตามฉันต้องตั้งค่า vaiable = ให้กับองค์ประกอบอาร์เรย์ $ var = $ ary [1]; ไม่ทำงาน, ไม่เป็นผล. ary [1] = "test" ถ้าช่วยได้.
แดน

1
เรียกใช้ตัวนับด้วยตัวคุณเองและตั้งค่าดัชนีในอาร์เรย์
Prasad

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

เห็นได้ชัดว่าคุณจะต้องสร้างที่จับไฟล์ก่อนและเก็บไว้ใน$fileไฟล์.


7

มันง่ายมาก:

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

file_get_contents() - รับไฟล์ทั้งหมดเป็นสตริง

explode("\n")- จะแยกสตริงด้วยตัวคั่น"\n"- ASCII-LF คืออะไร Escape สำหรับขึ้นบรรทัดใหม่

แต่ให้ใส่ใจ - ตรวจสอบว่าไฟล์มีUNIX -Line endings

ถ้า"\n"จะไม่ทำงานอย่างถูกต้องคุณมีการเข้ารหัสอื่น ๆ of2 ขึ้นบรรทัดใหม่และคุณสามารถลอง"\r\n", "\r"หรือ"\025"



1

คุณมาถูกทางแล้ว แต่มีปัญหาบางอย่างกับรหัสที่คุณโพสต์ ก่อนอื่นไม่มีวงเล็บปิดสำหรับลูป while ประการที่สอง $ line_of_text จะถูกเขียนทับทุก ๆ การวนซ้ำซึ่งแก้ไขได้โดยการเปลี่ยน = เป็น a. = ในลูป ประการที่สามคุณกำลังระเบิดอักขระตามตัวอักษร '\ n' ไม่ใช่ขึ้นบรรทัดใหม่จริง ใน PHP เครื่องหมายคำพูดเดี่ยวจะแสดงถึงอักขระตามตัวอักษร แต่เครื่องหมายคำพูดคู่จะแปลค่าอักขระและตัวแปรที่ไม่ได้รับการยกเว้น

    <?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);

สิ่งนี้จะยอมรับไฟล์ txt เป็นอาร์เรย์ ดังนั้นเขียนอะไรก็ได้ในไฟล์ links.txt (ใช้หนึ่งบรรทัดสำหรับหนึ่งองค์ประกอบ) หลังจากนั้นให้เรียกใช้หน้านี้ :) อาร์เรย์ของคุณจะเป็น $ file


0

สิ่งนี้ได้รับการกล่าวถึงที่นี่ค่อนข้างดี แต่ถ้าคุณต้องการประสิทธิภาพที่ดียิ่งกว่าสิ่งที่ระบุไว้ที่นี่จริงๆคุณสามารถใช้แนวทางนี้strtokได้

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

หมายเหตุสิ่งนี้จะถือว่าไฟล์ของคุณถูกบันทึกด้วย\nอักขระขึ้นบรรทัดใหม่ (คุณสามารถอัปเดตได้ตามต้องการ) และยังเก็บคำ / ชื่อ / บรรทัดเป็นคีย์อาร์เรย์แทนค่าเพื่อให้คุณสามารถใช้เป็น ตารางการค้นหาที่อนุญาตให้ใช้isset(มากเร็วกว่ามาก) แทนin_array.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.