5

我感觉我快到了。这是一个 .txt 文件,大约 60 KB,里面全是德语单词。每个单词都换行。

我想用这段代码遍历它:

<?php

    $file = "GermanWords.txt";
    $f = fopen($file,"r");

    $parts = explode("\n", $f);

    foreach ($parts as &$v) 
    {
        echo $v;
    }

?>

当我执行这段代码时,我得到:Resourceid#2 这个词资源不在.txt中,我不知道它来自哪里。

我怎样才能设法显示txt中的所有单词?

4

5 回答 5

12

无需fopen使用file_get_contents

$file = "GermanWords.txt";
$contents = file_get_contents($file);
$lines = explode("\n", $contents); // this is your array of words

foreach($lines as $word) {
    echo $word;
}
于 2012-09-30T21:26:04.143 回答
8

fopen()只是打开文件,它不读取它——在你的代码中,$f包含一个文件句柄,而不是文件内容。这就是“资源”一词的来源;它是文件句柄的 PHP 内部名称。

一种答案是替换fopen()file_get_contents(). 这将在一个操作中打开并读取文件。这将解决问题,但如果文件很大,您可能不想一次将整个内容读入内存。

所以我建议改为使用SplFileObject(). 代码如下所示:

<?php
$file = "GermanWords.txt";
$parts = new SplFileObject($file);
foreach ($parts as $line) {
    echo $line;
}
?>

它一次只读入内存一行,因此您不必担心文件的大小。

希望有帮助。

有关更多信息,请参阅 PHP 手册:http: //php.net/manual/en/splfileobject.construct.php

于 2012-09-30T21:27:52.710 回答
1

$f,结果fopen是资源,而不是文件的内容。如果您只想要文件中包含的行数组,您可以使用file

$parts = file('GermanWords.txt');
foreach($parts as $v){
    echo $v;
}

或者,如果您想坚持使用fopen,可以使用fread阅读内容:

$f = fopen('GermanWords.txt', 'r');
// read the entire file into $contents
$contents = fread($f, filesize('GermanWords.txt'));
fclose($handle);
$parts = explode("\n", $contents);
于 2012-09-30T21:26:05.153 回答
1

在处理文件之前读取文件的全部内容(使用file_get_contents)可能会消耗内存。

如果你想逐行处理文件,这个类可能会帮助你。

它实现了一个Iterator(参见phpdoc 关于它),可以foreach循环遍历。只有读取的最后一行存储在内存中。

class TxtFileIterator implements \Iterator{

protected $fileHandler;
protected $key;
protected $current;
protected $fileName;

function __construct($fileName){
    $this->fileHandler = fopen($fileName, "r") or die("Unable to open file!");        

    $this->fileName = $fileName;
    $this->key = 0;
}

function __destruct(){
    fclose( $this->fileHandler );
}

//Iterator interface
public function current (){       
    return $this->current;
}

public function key (){
    return $this->key;
}

public function next (){
    if ( $this->valid() ){
        $this->current = fgets( $this->fileHandler );
        $this->key++;
    }
}

public function rewind (){
    $this->__destruct();
    $this->__construct( $this->fileName );
}

public function valid (){
    return !feof( $this->fileHandler );
}    

用法 :

$iterator = new TxtFileIterator("German.txt");

foreach ($iterator as $line) {
    echo $line;// or do whatever you want with line
}
于 2018-05-04T10:33:17.563 回答
0

提供SplFileObject一种方法来做到这一点

$file = new SplFileObject("file.txt");
while (!$file->eof()) {
    echo $file->fgets();
}

如果您更喜欢 foreach 循环,您可以为此创建一个生成器函数

function lines($filename) {
    $file = new SplFileObject($filename);
    while (!$file->eof()) {
        yield $file->fgets();
    }
}

foreach (lines('German.txt') as $line) {
    echo $line;
}
于 2018-05-17T09:52:48.360 回答