2012-03-17 10 views
0

foreachループ内でファイルを書き込む際に問題が多いです。配列の末尾にある行または配列の先頭にある行を書き込みます。コードは、このファイルを開き、=使用して、区切り文字を爆発使用して各アレイを分離するphpを使ってforループ内にファイルを書き込む

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 

ファイルは、このような要素が含まれ、たとえば

。そして、それはファイルに保存し、その後array_unique機能&を使ってユニークな要素を選択しますそのような要素

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

を返します。私はこのコードを持っています。助けてください

+0

foreachループでファイルを開き、毎回切り捨てる以外に、foreachループとファイルが書き込まれるまで重複を削除しないので、重複を含むすべてがファイルに巻き込まれます。 – Jason

答えて

0

これまでのコンテンツを上書きしている間に、常にそのファイルに現在のURLを書き込んでいるというのは意味がありません。 foreach-loopのすべてのステップで、そのファイルを再度開き、その内容を消去し、そのファイルに1つの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私はあなたのコードから今働いている:) –

0

"w+"は、古いコンテンツを一掃、各オープンに新しいファイルを作成します。

"a+"が問題を解決しますが、ループの前に書いてファイルを開き、その後ろを閉じてください。

関連する問題