2014-03-31 157 views
-1

中給出的資源我試圖在文件中搜索,如果一個IP已經在那裏與in_array。但我得到這個錯誤 Warning: in_array() expects parameter 2 to be array, resource given in警告:in_array()期望參數2是數組,在

var $RATES_RESULT_FILE = "results.txt"; 
    function writeResult($item,$rate){ 
    $ip  = getenv('REMOTE_ADDR'); // ip looks like an usual ip 127.0.0.1.. 
    $f = fopen($this->RATES_RESULT_FILE,"a+"); 
    if(!in_array($ip, $f)) { 
    if ($f != null) {  
     fwrite($f,$item.':::'.$ip.':::'.$rate."\n"); 
     fclose($f); 
    } 
    } 
    } 

fwrite看起來英語是這樣的:$ F,字符串::: 127.0.0.1 ::: 5(1至5個票)

它接縫是承認該文件作爲一種資源,而不是的數組,有無論如何將文件從資源轉換爲數組。 最終RESULTS.TXT文件看起來水木清華這樣的:

String:::41.68.178.78:::3 
String:::41.68.178.78:::2 
String:::41.68.178.78:::1 
String:::175.68.178.78:::5 
+0

'$ F'不是一個數組,這樣做的'in_array()'在它不會工作。 'fopen()'實際上並不讀取任何數據;它只是打開文件準備閱讀。 – Spudley

+0

爲什麼你認爲PHP會奇蹟般地從'fopen()'返回數組 –

回答

0

擴展Doge的答案,您將首先需要構建您的數組。這可以通過使用file給出的陣列上的array_map解析出IP地址來完成。然而,它可能更容易做到這一點:

$contents = file_get_contents($this->RATES_RESULT_FILE); 
if(strpos($contents,$ip) === false) { 
    $contents .= $item.":::".$ip.":::".$rate."\n"; 
    file_put_contents($this->RATES_RESULT_FILE, $contents); 
} 

但是,這可能會相當內存密集型,特別是如果文件變大。更內存友好的方式會是這樣的:

exec("grep -F ".escapeshellarg($ip)." ".escapeshellarg($this->RATES_RESULT_FILE), 
                  $_, $exitcode); 
// I use $_ to indicate a variable we're not interested in 

if($exitcode == 1) { // grep fails - means there was no match 
// or use $exitcode > 0 to allow for error conditions like file not found 
    $handle = fopen($this->RATES_RESULT_FILE,"ab"); 
    fputs($handle, $item.":::".$ip.":::".$rate."\n"); 
    fclose($handle); 
} 

編輯:exec基替代fopen/fputs/fclose

exec("echo ".escapeshellarg($item.":::".$ip.":::".$rate."\n")." >> " 
            .escapeshellarg($this->RATES_RESULT_FILE)); 
+0

這正是我所需要的。 – user3467855

+0

很高興我可以幫助 - 我只是在一個基於exec的文件操作替換中編輯,這可能會更快,更有彈性的競爭條件。 –

0
$f = fopen($this->RATES_RESULT_FILE,"a+"); 
if(!in_array($ip, $f)) { 

$f是一個文件資源不是一個數組。

您是否打算用file代替?

$f = file($this->RATES_RESULT_FILE); 
if(!in_array($ip, $f)) { 
相關問題