0

foreach ループ内でファイルを書き込んでいるときに、多くの問題が発生しています。配列の最後にある行、または配列の先頭にある行を書き込みます。

例えば:

ファイルにはそのような要素が含まれています。

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);
4

2 に答える 2

0

意味をなさないのは、前のコンテンツを上書きしながら、常に現在のURLをそのファイルに書き込んでいるという事実です。foreachループのすべてのステップで、そのファイルを再度開き、その内容を消去して、そのファイルに1つのURLを書き込みます。次のステップでは、まったく同じファイルを再度開いて、それを再度実行します。そのため、そのファイルの最後の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);
于 2012-03-17T10:55:04.953 に答える
0

"w+"開くたびに新しいファイルが作成され、古いコンテンツが消去されます。

"a+"問題は解決しますが、ループの前に書き込み用にファイルを開き、ループの後で閉じることをお勧めします。

于 2012-03-17T10:55:14.140 に答える