0

いくつかの助けをいただければ幸いです

次の内容のtxtファイルがあります。

1234|dog|apartment|two
1234|cat|apartment|one
1234|dog|house|two
1234|dog|apartment|three

動物が「家」に住む「犬」のエントリを削除したい

<?php
if (isset($_POST['delete_entry]))
{
    //identifies the file
    $file = "db.txt";
    //opens the file to read
    @$fpo = fopen($file, 'r');
    //while we have not reached the end of the file
    while(!feof($fpo))
    {
        //read each line of the file into an array called animal 
        $animal[] = fgets($fpo);
    }
    //close the file
    fclose($fpo);

    //iterate through the array
    foreach ($animal as $a)
    {
        if the string contains dog and apartment
        if ((stripos ($a, 'dog']))&&(stripos ($a, 'house')))
        {
            //dont do anything            
        }
        else
        {
            //otherwise print out the string
            echo $a.'<br/>';
        }
    }
}
?>

これにより、'dog' と 'house' が表示されるエントリのない配列が正常に出力されます。ただし、これをフラットファイルに書き戻す必要がありますが、問題が発生しています。

各エントリが見つかったらすぐにファイルに書き戻すなど、さまざまなオプションを試しました。

Warning: feof() expects parameter 1 to be resource, boolean given in 
Warning: fwrite(): 9 is not a valid stream resource in
Warning: fclose(): 9 is not a valid stream resource in 

これらは私が遭遇したエラーの中にあります。配列についての私の理解から、
- animal と呼ばれるこの配列を
調べると、- インデックス [0] の 2 つの条件がチェックされ、
- エントリが見つからない場合は、$a に割り当てられます。
- 次に、インデックス [1] から始まる配列を通過し
ます。 - など。
新しい値が $a に割り当てられるたびに。

表示されるたびにファイルに出力するとうまくいくと思いましたが、ここで上記の fwrite および fclose エラーが発生し、これを解決する方法がわかりません (まだ)。

具体的に選択された 1 つのエントリについて、「アパート」を家に置き換える必要がある部分をまだ少し実行する必要がありますが、「削除」を整理するとそこに到達します。

コードは必要ありません。おそらく、私を支援するロジックフローだけです。

ありがとう

4

6 に答える 6

1

時間を節約するために、ファイルから読み取るときに検証ルールに合格した場合にのみ、データを配列に格納できます。ファイルの最後を読み取った後、配列をファイルに書き戻す準備が整います。

于 2012-02-07T20:47:03.400 に答える
1

手順についてはどうですか:

  • ファイルを読み取ります。
  • ファイルの内容を配列に格納します。
  • 配列から項目を削除します。
  • ファイルを新しい内容で上書きします。
于 2012-02-07T20:41:48.963 に答える
0

できることは、ソース ファイルを読み取りモードで開き、一時ファイルを書き込みモードで開くことです。「in」ファイルからコンテンツを読み取ると、「out」ファイルに行が書き込まれます。「in」ファイルが処理されて閉じられると、「out」の名前が「in」に変更されます。このようにして、メモリの制約について心配する必要が少なくなります。

各行を処理するときは、'|' で分割したほうがよいため、2 番目の要素には動物の名前が含まれ、3 番目の要素には住居の名前が含まれていることがわかります。猫が犬小屋に住んでいるかどうかは誰にもわかりません。

于 2012-02-07T20:45:55.297 に答える
0
<?php
    $fileName = 'db.txt';

    $data = @file($fileName);

    $id = 0;
    $animal = "";
    $type = "";
    $number = 0;

    $excludeAnimal = array("dog");
    $excludeHouseType = array("house");

    foreach($data as $row) {
        list($id,$animal,$type,$number) = explode("|",$row);
        if(in_array($animal,$excludeAnimal) && in_array($type,$excludeHouseType))
            continue
        /* ... code ... */
    }
?>
于 2012-02-07T20:46:59.267 に答える
0

これは元の質問への回答ではありませんが、私が思いついたことを共有したいと思います。

これにより、スクリプト全体が3行で実行されると確信しています。

$file = file_get_contents( 'db.txt');
$result = preg_replace('/^\d+\|dog\|house\|\w+$/m', '', $file);
file_put_contents( 'db.txt', $result);

正規表現を使用して行を に置き換えてからdog|house、ファイルを書き戻します。

于 2012-02-07T20:50:09.847 に答える
0
  1. に削除したいデータまで、すべてのデータを読み込んでダンプします$array_1
  2. 残りのファイルを読み込んで にダンプします$array_2
  3. 2 つの配列を に連結し、$newarray元のフラットファイルに書き直します。

単純!

于 2012-02-20T07:55:17.507 に答える