【问题标题】:PHP: How to seek backwards to find last N linesPHP:如何向后寻找最后 N 行
【发布时间】:2011-05-26 19:22:02
【问题描述】:

我想我可以调用tail,但这意味着取决于外部程序。有没有办法只使用 PHP 以有效的方式做到这一点?


更新:对于那些感兴趣的人,我遵循了我在接受的答案中得到的建议,并尝试在自己身上实施。把它on my blog =)

【问题讨论】:

    标签: php tail


    【解决方案1】:

    所以你想要字符串的最后n 行?

    function getLastLines($string, $n = 1) {
        $lines = explode("\n", $string);
    
        $lines = array_slice($lines, -$n);
    
        return implode("\n", $lines);
    }
    

    然后您可以使用getLastLines($str, $num); 调用它,其中$num 是一个正整数,$str 是您要切分的字符串。

    如果您想要不同的东西,例如使用文件作为源,你需要一些不同的东西——也许使用file而不是explode

    【讨论】:

    • 这会将整个事情拉入内存,不是吗?
    • 对...我认为目标是使用模式a+ 调用fopen() 并向后搜索...而不是先读取整个文件。
    • +1 我已经将整个字符串保存在内存中以用于另一个目的 - 这正是我想要避免再次重新打开文件的需要
    【解决方案2】:

    基本上,您必须复制tail。打开文件,跳到最后,然后开始向后阅读。读取一个块,计算换行符,重复直到换行数>所需的行数,然后从那个换行符开始转储所有内容。

    【讨论】:

      【解决方案3】:

      最简单的方法是使用文件。它将整个文件加载到一个数组中,每个项目一行。使用 count 计算总行数,从该索引中减去 100 en,您可以对这些行做任何您想做的事情。

      http://nl.php.net/manual/en/function.file.php

      对于非常大的文件,这并不是很有效。然后你最好使用 fstat 来获取文件大小, fseek 返回 x 字节数,计算你可以读取的行数,然后可能会进一步搜索,直到找到 100 行。我敢打赌,tail 这样的工具从一开始就不算数,但会做类似的事情。

      【讨论】:

        【解决方案4】:

        如果您使用file() 将文件作为数组读取,则可以使用array_splice 指定最后N 行:

        test.txt

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        

        test.php

        $lines = file('test.txt');
        $line_number = 5;
        
        echo implode("", array_splice($lines, count($lines) - $line_number));
        

        输出

        $ php test.php
        6
        7
        8
        9
        10
        

        【讨论】:

          猜你喜欢
          • 2016-02-24
          • 2021-05-07
          • 1970-01-01
          • 2021-09-14
          • 2021-11-19
          • 1970-01-01
          • 1970-01-01
          • 2013-01-17
          • 1970-01-01
          相关资源
          最近更新 更多