3

次の方法はありますか?

  1. small_db.php の行数 (1 行 = データ行) を数える
  2. PHP に、ファイル ポインタを 322 行目の先頭に正確に移動するように指示します (したがって、この行から fget() データを取得できます)。
  3. テキスト「Quick Brown fox」が発生する行番号または行の内容全体を返すように PHP に指示しますか?

ファイルのすべての内容を 1 つの文字列で取得する別の方法があることは知っていますが、ご存知のように、ファイルのサイズが大きい場合、その方法は時間とメモリの効率が悪くなります。

4

1 に答える 1

14

まず、いくつかの基本的な変数を次に示します。

$filename = 'small_db.php';
$linenum  = 322;
$needle = 'Quick brown fox';
  1. ファイル内の行数をカウントするにはどうすればよいですか?

    これをすばやく簡単に行うには、次のコマンドcount()でファイルを開いた後に使用しfile()ます。

    $count = count( file( $filename));
    

    ただし、ファイルが大きい場合、 からの戻り値をカウントするためにファイル全体をメモリにロードする必要があるため、これは大量のメモリを使用しfile()ます。または、標準のファイル関数 、fopen()feof()fgets()およびfclose()を使用して、ファイルを開いて行ごとに読み取り、次のようにカウントを維持することもできます。

    $count = 0;
    $fp = fopen( $filename, 'r');
    
    while( !feof( $fp)) {
        fgets( $fp);
        $count++;
    }
    
    fclose( $fp);
    
  2. ファイルポインタを特定の行番号の先頭に移動するにはどうすればよいですか?

    SplFileObjectこれは、クラスを使用して最もよく達成されます。開いているファイルのファイル名でこのクラスの新しいオブジェクトを作成し、seek()選択した行番号をシークするために使用します。を使用key()して行番号を表示し、current()(またはgetCurrentLine()またはfgets()) を使用してその行の内容を取得できます。次のようにします。

    // Create a new object for the file
    $file = new SplFileObject( $filename);
    
    // Seek to to the specific line number
    $file->seek( $linenum);  
    
    // Print that line:
    echo 'Line #' . $file->key() . ' contains: ' . $file->current();
    
  3. 特定の針が発生する行番号または行の内容全体を返すにはどうすればよいですか?

    私の知る限り、これを実行できる組み込みの PHP 関数/メソッドはありません。この関数は、ファイル ポインターで指定されたファイル内の各行を、$fp大文字と小文字を区別する特定の$needle使用に対してチェックします (大文字と小文字を区別しない検索にstrpos()使用できます)。stripos()

    function find_in_file( $fp, $needle) {
        rewind( $fp); // Or: fseek($fp, 0);
    
        $line_number = 0;
    
        while( !feof( $fp)) {
            $line = fgets( $fp);
            if( !( strpos( $line, $needle) === false)) {
                break;
            }
            $line_number++;
        }
    
        return feof( $fp) ? null : array( 
            'line_number' => $line_number,
            'line' => fgets( $fp)
        );
    }
    

    この関数を次のように呼び出す必要があります。

    $fp = fopen( $filename, 'r');
    $return = find_in_file( $fp, $needle);
    if( !is_null( $return)) {
        echo 'Found ' . $needle . ' in line #' . $return['line_number'] . "\n";
        echo 'That line contains: ' . $return['line'];
    }
    fclose( $fp);
    
于 2012-06-23T16:12:11.273 に答える