2012-03-17 58 views
0

在foreach循環內編寫文件時遇到了很多問題。它要麼寫入數組的最後一行,要麼寫入數組的開頭。使用php寫循環內的文件使用php

例如:

一個文件包含這樣的元件,

page.php?id=1 
page.php?id=3 
page.php?id=4 
investor.php?id=1&la=1 
page.php?id=15 
page.php?id=13 
page.php?id=14 

的代碼將打開這個文件,然後使用通過利用爆炸=定界符每個陣列分離。並且將返回這些元素

page.php?id 
page.php?id 
page.php?id 
investor.php?id 
page.php?id 
page.php?id 
page.php?id 

那麼它會選擇使用array_unique功能&然後將其保存在一個文件中的獨特元素。我有這個代碼。請幫我

$lines = file($fopen2); 
    foreach($lines as $line) 
    { 
    $rfi_links = explode("=",$line); 
    echo $array = $rfi_links[0]; 
    $save1 = $rfi.$file.$txt; 
    $fp=fopen("$save1","w+"); 
    fwrite($fp,$array); 
    fclose($fp); 
    } 
    $links_duplicate_removed = array_unique($array); 
    print_r($links_duplicate_removed); 
+0

除了在foreach循環中打開文件並每次截斷文件之外,在foreach循環和文件寫入之前,您都不會刪除重複項,因此所有內容(包括重複項)都會在文件中結束。 – Jason 2012-03-17 11:30:53

回答

0

什麼樣的沒有意義,就是你總是寫入當前的URL到該文件而覆蓋它以前的內容這一事實。在foreach循環的每一步中,您都會重新打開該文件,清除其內容並將一個url寫入該文件。在下一步中,您重新打開完全相同的文件並重新執行該操作。這就是爲什麼最終只有該文件中的最後一個URL。

您將需要收集陣列中的所有URL,扔掉重複,然後寫了獨特的人到光盤:

$lines = file($fopen2); 
$urls = array();       // <-- create empty array for the urls 

foreach ($lines as $line) { 
    $rfi_links = explode('=', $line, 2); // <-- you need only two parts, rights? 
    $urls[] = $rfi_links[0];    // <-- push new URL to the array 
} 

// Remove duplicates from the array 
$links_duplicate_removed = array_unique($urls); 

// Write unique urls to the file: 
file_put_contents($rfi.$file.$ext, implode(PHP_EOL, $links_duplicate_removed)); 

另一種解決方案(由前一種方法更啓發)是打開文件一次,開始遍歷行之前:

$lines = file($fopen2); 
$urls = array(); 

// Open file 
$fp = fopen($rfi.$file.$ext, 'w'); 

foreach ($lines as $line) { 
    $rfi_url = explode('=', $line, 2); 

    // check if that url is new 
    if (!in_array($rfi_url[0], $urls)) { 
     // it is new, so add it to the array (=mark it as "already occured") 
     $urls[] = $rfi_url[0]; 

     // Write new url to the file 
     fputs($fp, $rfi_url[0] . PHP_EOL); 
    } 
} 

// Close the file 
fclose($fp); 
+0

感謝Niko我從你的代碼中獲得了它的工作:) – 2012-03-17 12:35:43

0

"w+"將創建每個打開一個新的文件,消滅舊的內容。

"a+"解決了這個問題,但最好打開文件在循環之前寫入,然後在循環之後關閉。