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

PHP如何获取文件中的行数并将文件指针移动到指定行?,php,filesystems,flat-file,Php,Filesystems,Flat File,有没有办法: 计算我的small_db.php中的行数(1行=数据行) 告诉PHP将文件指针精确地移动到第322行的开头。(这样我就可以从此行中获取fgets()数据) 告诉PHP返回行号或出现文本“QuickBrownFox”的行的全部内容 我知道还有另一种方法可以在一个字符串中获取文件的所有内容,但正如您所知,如果文件的大小很大,则该方法的时间和内存效率都很低。首先,这里是一些基本变量: $filename = 'small_db.php'; $linenum = 322; $needle

有没有办法:

  • 计算我的small_db.php中的行数(1行=数据行)
  • 告诉PHP将文件指针精确地移动到第322行的开头。(这样我就可以从此行中获取fgets()数据)
  • 告诉PHP返回行号或出现文本“QuickBrownFox”的行的全部内容

  • 我知道还有另一种方法可以在一个字符串中获取文件的所有内容,但正如您所知,如果文件的大小很大,则该方法的时间和内存效率都很低。

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

    $filename = 'small_db.php';
    $linenum  = 322;
    $needle = 'Quick brown fox';
    
  • 如何计算文件中的行数

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

    但是,如果文件很大,这将占用大量内存,因为它必须将整个文件加载到内存中,以便计算
    file()
    的返回值。或者,您可以使用标准文件函数、、和来打开文件并逐行读取,同时保持计数,如下所示:

    $count = 0;
    $fp = fopen( $filename, 'r');
    
    while( !feof( $fp)) {
        fgets( $fp);
        $count++;
    }
    
    fclose( $fp);
    
    // 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();
    
  • 如何将文件指针移动到特定行号的开头

    这最好使用类来实现。使用要打开的文件的文件名创建此类的新对象,然后使用来查找所选的行号。然后可以使用显示行号和(或)获取该行的内容,如下所示:

    $count = 0;
    $fp = fopen( $filename, 'r');
    
    while( !feof( $fp)) {
        fgets( $fp);
        $count++;
    }
    
    fclose( $fp);
    
    // 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();
    
  • 如何返回行号或特定指针所在行的全部内容

    据我所知,没有内置的PHP函数/方法可以做到这一点。您需要自己使用类似于此函数的方法对其进行解析,该函数检查文件中的每一行(由其文件指针
    $fp
    给出),并使用特定的区分大小写
    $needle
    进行检查(可用于不区分大小写的搜索):

    您需要这样调用此函数:

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

  • 不久前,我写了一篇博客文章,解释了如何使用PHP截短文件的最后N行,我认为同样的逻辑将有助于您实现所需: