0

"="の後にテキストファイルの値を変更しようとしています。explodeは2つの要素の配列を返します。2番目の要素を新しい値に置き換えてからファイルに書き込みたいのですが、構文がわかりません。 !!

 $trID_Log_File = $fileName;
 if(file_exists($trID_Log_File) && filesize($trID_Log_File) > 0) 
   {    
    $h = fopen($trID_Log_File, "r");
    $contents = fread($h, filesize($trID_Log_File));
    fclose($h);

    if(!stristr($contents, "TrID is best suited to analyze binary files!")) 
    {

        $lines = explode("\n", $contents);
        foreach($lines as $line) 
        {
            if(strlen($line) > 5) 
            {
                $line_arr=explode("=",$line);

                                    if ($line_arr[0]=='Sally')
                                    {
                  $line_arr[1]="10"; // The New Value // ??????
                                       fwrite($h,$line_arr,"w+")     ; // ?????????
                                   }
            }
                 }
     }
   }

入力:

sally= 10
samy=40

必要な出力:

sally=55
samy=123 

この問題の正しい構文は何ですか!! 私はいくつかのコードが欠けていますか?ありがとう

4

2 に答える 2

0

ここに作業コードがあります:

<?php
if(file_exists($trID_Log_File) && filesize($trID_Log_File) > 0)  {    
  $h = fopen($trID_Log_File, "r");
  $contents = fread($h, filesize($trID_Log_File));
  fclose($h);
  $out_h = fopen("output filename", "w");    
  if(!stristr($contents, "TrID is best suited to analyze binary files!")) {
    $lines = explode("\n", $contents);
    foreach($lines as $line) {
      if(strlen($line) > 5) {
        $line_arr=explode("=",$line);      
        if ($line_arr[0]=='Sally') {
          $line_arr[1]="10"; // The New Value 
        }
        fwrite($out_h, implode("=", $line_arr)."\n"); 
      }
    }
  }
}

あなたのコードにはいくつかの間違いがあります。まず、配列をファイルに書き込もうとしていますが、関数を使用して区切り記号implode付きの文字列に変換する必要があります。=

第二に、あなたはfwrite完全に間違っています。この関数の最初の引数は、開いているファイル ハンドラでなければなりませんが、閉じたものを渡しました。2 番目のパラメーターは、書き込む文字列でなければなりません。配列を渡しました。3 番目のオプションの引数は長さですが、「w+」を渡しました。これは fwrite には意味がありません。fwrite はファイルを開くことができないため、ファイル アクセス修飾子では機能しません。

第 3 に、タスクを実装するためにその場でファイルを変更することはできません。これを行う必要がある場合は、ファイルカーソルを各行の先頭に設定してから、その行を新しい内容で上書きする必要があります。また、新しい行の長さが古い行の長さと等しくない場合、非常に複雑になります。したがって、別の出力ファイルを作成し、すべての出力をそこに書き込む必要があります。

私が投稿したコードには、他にもいくつかの問題があります。

  • これは、大きなファイルでは機能しません。想定されている場合は、ファイル全体をメモリにロードしないでください。を使用して行を読み取りfgets、処理し、新しいファイルに書き込み、次の行を読み取ります。
  • 「Sally」を含まない行は出力ファイルに含まれません。この動作を変更することができます。

また、stristr状態は確認しておりませんので動作確認はしておりません。

そして、これはすべて構文に関するものではありません。インタープリターは、構文エラーがある場合、非常に具体的に教えてくれます。

于 2012-11-18T09:18:02.780 に答える
-1
if(strlen($line) > 5) {
$line_arr=explode("=",$line);

if ($line_arr[0]=='Sally'){
    $line_arr[1]="10"; // The New Value // ??????
    $new_line = implode("=", $line_arr); //reconstruct the string here
    // or something like that :
    // $new_line = $line_arr[0] . "=10";
    fwrite($h,$new_line)     ; // ?????????
}
}

ファイルに書き込む前に、アレイで implode を使用します。そうでない場合は、ファイルに配列を書き込もうとしています...前に文字列を再構築する必要があります!

于 2012-11-18T09:04:08.250 に答える