文件中的可变内容消失,循环不进入

时间:2012-12-10 15:10:35

标签: php foreach fwrite fgets

我有以下代码从文件中读取,并在计算完成后写回。

    if(file_exists(CACHE_FILE_PATH)) {
        //read the cache and delete that line!
        $inp = array();
        $cache = fopen(CACHE_FILE_PATH, 'r');
        if($cache) {
            while(!feof($cache)) {
                $tmp = fgets($cache);
                //some logic with $tmp
                    $inp[] = $tmp;
            }

            fclose($cache);
        }

        var_dump($inp);

        $cache = fopen(CACHE_FILE_PATH, 'w');

        var_dump($inp);
        if($cache) {

            var_dump($inp);

            foreach ($inp as $val) {
                echo "\nIN THE LOOP";
                fwrite($val."\n");
            }

            fclose($cache);
        }   
    }

var_dumps的输出是:

array(3) {
  [0]=>
  string(13) "bedupako|714
"
  [1]=>
  string(16) "newBedupako|624
"
  [2]=>
  string(19) "radioExtension|128
"
}
array(3) {
  [0]=>
  string(13) "bedupako|714
"
  [1]=>
  string(16) "newBedupako|624
"
  [2]=>
  string(19) "radioExtension|128
"
}
array(3) {
  [0]=>
  string(13) "bedupako|714
"
  [1]=>
  string(16) "newBedupako|624
"
  [2]=>
  string(19) "radioExtension|128
"
}

即使它是一个数组,它也不会进入循环并打印IN THE LOOP!为什么呢?

1 个答案:

答案 0 :(得分:3)

这部分代码:

fwrite($val."\n");

应该是:

fwrite($cache, $val); // the "\n" is only required if it was stripped off after fgets()

fwrite()的第一个参数必须是使用fopen()打开的文件描述符。

当然,如果您在开发期间启用了error_reporting(-1)ini_set('display_errors', 'On'),您会立即发现这一点:)

正如评论中所建议的那样,您应该尝试使用file()之类的结构来简化代码,将整个文件读入一个行数组,然后使用join()file_put_contents()来写下整件事。

如果您只想要一个键/值对的缓存,您可以查看以下内容:

// to read, assuming the cache file exists
$cache = include CACHE_FILE_PATH;

// write back cache
file_put_contents(CACHE_FILE_PATH, '<?php return ' . var_export($cache, true) . ';');

它读取和写入包含PHP本身可以读取的数据结构的文件(比你快得多)。