2014-10-30 69 views
0

我遇到了處理腳本的問題。我想在csv文件中允許最多2個重複的IP地址,以防止一些垃圾郵件,並考慮到用戶可能在填表時犯了一個錯誤。我似乎無法在腳本中正確引用$ ip變量,或者可能有一些我完全錯過了。這裏是代碼片段迄今:允許2個重複的IP地址最大值php csv

<?php 
#VARIABLE DECLARATIONS (filename and post vars) GO HERE 
$counter = 0; 
if (file_exists($filename)) 
{ 
    $file = fopen($filename, "a"); 
    while($data = fgetcsv($filename)){ 
     if(isset($data[$ip])){ 
      $counter++; 
      continue; 
      if((isset($data[$ip])){ 
       $counter++; 
       if($counter == 2){ 
        echo ""; 
       } 
      } 
     } 
    } 
    ##file write goes here 
} 

?> 

任何幫助,將不勝感激,

吉姆

+0

當你的腳本開始工作時,它是否有空的csv文件,或者它已經有一些數據?你是從一個數組中讀取csv文件還是從同一個csv文件讀取數據(即你的腳本有效地從csv文件中刪除多餘的IP)? – 2014-10-30 11:29:38

+0

將會執行'continue'後的任何內容。 – Barmar 2014-10-30 11:34:06

+0

感謝您的回覆,.csv文件已將文件中的數據包含標題,並且.csv文件在從相同的.csv文件讀取後寫入。 – Soxxxy 2014-10-30 11:36:48

回答

0

你必須先和你的後,纔讀陣列中的所有元素準備好每個IP地址的次數,應該繼續寫入文件(單獨的文件可能是?)。

您可以首先準備一個帶有IP索引的數組,並將與IP對應的所有行作爲該屬性的值屬性。 可以這樣做 -

$csvArray = str_getcsv(file_get_contents('myCSVFile.csv')); 

foreach($csvArray as $eachRow) 
{ 
    //prepare IP indexed array with every detail row as an attribute of the corresponding IP key. 
    $properlyFormattedArray[$eachRow[5]][] = $eachRow; 
} 

你得到一個這樣的數組 -

Array(['92.27.21.171'] => 
     [0] => Array("Mr","Test","davis","07972889989","01159174767","92.27.21.171"), 
     [1] => Array("Mr","bob","jones","07998998008","01159174767","92.27.21.171"), 


     ... 
     ['92.27.21.172'] => ... 

) 

一旦你有了這個數組,在它剛剛循環,並僅在最大寫兩行,每IP。

foreach($properlyFormattedArray as $ip => $details) 
{ 
    $count = 0; 
    foreach($details as $eachDetail) 
    { 
     if($count<2) 
     { 
      //write $eachDetail into file 
      $count++; 
     } 
    } 

} 

但是,在這種情況下,數據(與輸入文件相比)的訂單將被改變,重複的將被寫入CSV文件連續行(不知道你會不會介意的它)。

+0

謝謝你的洞察和幫助,我會當我解決了問題後回覆 – Soxxxy 2014-10-30 12:19:37

+0

好的,當然...... – 2014-10-30 12:35:16

+0

感謝您的幫助:文件正在寫入,但它插入了兩行。我只是希望它插入行,如果IP地址在文件中已經有一次,並且如果它已經在文件中已經駐留兩次,則跳過它 – Soxxxy 2014-10-30 12:52:49