2012-12-10 27 views
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!爲什麼?

+0

'$ cache'可能不會評估爲'true'。你在不同的地方有3個'var_dump()'調用,所以不可能知道代碼的哪個部分被執行。 – MrCode

+0

fwrite($ val。「\ n」);'不會在這裏抱怨,因爲第一個參數是文件資源。 – Crisp

回答

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本身可以讀取(快很多能夠)。

+0

^- ^愚蠢的錯誤。謝謝... – footy

+1

但答案相當有限。首先應該看看PHP的高級文件功能。例如,您可以使用PHP文件或INI文件來創建易於訪問的鍵值文件存儲。保持你的代碼小,然後你沒有那麼多的地方,你可以做出愚蠢的錯誤。 '$ inp = file(CACHE_FILE_PATH);'和寫入use implode,這也概述以及http://php.net/file - 也見http://php.net/var_export – hakre

+0

@hakre足夠公平,增加了一個另一個例子。 –