0

ファイルから読み取り、計算後に書き戻すための次のコードがあります。

    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!なんで?

4

1 に答える 1

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自体が読み取ることができるデータ構造を含むファイルを読み書きします(あなたができるよりもはるかに高速です)。

于 2012-12-10T15:20:07.417 に答える