PHP方法获取文件中的行数并将文件指针移动到指定的行?

Mil*_*vić 4 php filesystems flat-file

有办法:

  1. count我的small_db.php中的行数(1行=数据行)
  2. 告诉PHP将文件指针精确地移动到第322行的开头.(所以我可以从这一行获取fgets()数据)
  3. 告诉PHP返回文本"Quick brown fox"发生的行号或整行内容?

我知道有另一种方法可以将文件的所有内容都放在一个字符串中,但是正如你所知,如果文件的大小很大,那么方法就是时间和内存效率低下.

nic*_*ckb 13

首先,这里有一些基本变量:

$filename = 'small_db.php';
$linenum  = 322;
$needle = 'Quick brown fox';
Run Code Online (Sandbox Code Playgroud)
  1. 如何计算文件中的行数?

    要快速轻松地执行此操作,请count()在打开文件后使用file():

    $count = count( file( $filename));
    
    Run Code Online (Sandbox Code Playgroud)

    但是,如果文件很大,这将占用大量内存,因为它必须将整个文件加载到内存中以便计算返回值file().另外,您也可以使用标准的文件的功能,fopen(),feof(), fgets(),和fclose(),打开该文件,并逐行读它,保持一个计数,当您去,就像这样:

    $count = 0;
    $fp = fopen( $filename, 'r');
    
    while( !feof( $fp)) {
        fgets( $fp);
        $count++;
    }
    
    fclose( $fp);
    
    Run Code Online (Sandbox Code Playgroud)
  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();
    
    Run Code Online (Sandbox Code Playgroud)
  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)
        );
    }
    
    Run Code Online (Sandbox Code Playgroud)

    您需要像这样调用此函数:

    $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);
    
    Run Code Online (Sandbox Code Playgroud)