Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何读取文件的最后10行并获取所需数据?_Php - Fatal编程技术网

Php 如何读取文件的最后10行并获取所需数据?

Php 如何读取文件的最后10行并获取所需数据?,php,Php,下面的函数DMMRankings()用于显示排名前25位的用户。但是,我想编辑这个函数来读取一个文本文件(它将有很多行,比如20.000行),所以它总是需要读取最后10行,而不是全部,因为这将是一个混乱的局面。示例文本文件中的两行: 1,42,16, 201,stackoverflow_user, 1, 6762160, 39799, 9817242, 6762160, 39884, 10010545,stackoverflow_usersecond, 2, 1351147, 1165, 483

下面的函数
DMMRankings()
用于显示排名前25位的用户。但是,我想编辑这个函数来读取一个文本文件(它将有很多行,比如20.000行),所以它总是需要读取最后10行,而不是全部,因为这将是一个混乱的局面。示例文本文件中的两行:

1,42,16, 201,stackoverflow_user, 1, 6762160, 39799, 9817242, 6762160, 39884, 10010545,stackoverflow_usersecond, 2, 1351147, 1165, 483259, 1351147, 1115, 241630, 0 
1,46,27, 201,[stackoverflow_user | stackoverflow_userother], 1, 4078465, 286991, 1594830, 4078465, 287036, 1643156,stackoverflow_userthird, 2, 1357147, 1115, 241630, 1357147, 1065, 120815, 0 
这些行的结构基本相似,但唯一的区别是第五列可以包含更多的用户名,因此我们必须始终阅读第一列。它是这样的:脚本应该读第4列、第5列(正如您所看到的,它应该读第一个名字,因为它可以扩展为其他名称,请参阅:第1行和第2行)和第13列。最后10行总共有4,5,13列所以我的问题是如何制作一个脚本来读取这个特定文本文件中最新的10行和特定列?

必须编辑的脚本:

    function DMMRankings()
    {
        $db = $this->database[GDB];
        $num_rows = $db->doQuery('SELECT TOP 25 UserName, Rank, Nation FROM USER WHERE Authority IN(1, 2) ORDER BY Rank DESC');
        if ($num_rows == -1)
        {
            $db->getError();
            return;
        }

        $n = 1;
        $content = '';
        while ($row = $db->doRead())
        {
            $data = array('rank-pos' => $n++, 'rank-name' => $row['UserName'], 'rank-nation' => $row['Nation'], 'rank-user' => number_format(intval($row['Rank'])));
            $content .= Template::Load('rankinguserdmm-' . ($n % 2 == 1 ? 2 : 1), $data);
        }

        $this->content = Template::Load('user_rankingsdmm', array('rankings' => $content));
    }

以下代码将完成您的任务:

# read a file into an array
$lines = file('/path/to/file.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

# take the last 10 lines of the file -- i.e. the last 10 values in the array
$last_ten = array_slice($lines, -10);

#create an array for the output
$output = array();

foreach ($last_ten as $l) {
    # treat the data as comma-separated values
    $arr = explode(",", $l);
    # if col 5 has multiple values, take the first one
    if (preg_match("/\[(.+?) \|/", $arr[4], $matches)) {
        $arr[4] = $matches[1];
    }
    # store the data we want in an output array.
    $output[] = array( $arr[3], $arr[4], $arr[12] );
}
print_r($output);
输出(我根据您的行编写了一些数据):


(等等)

粘贴的代码与读取文本文件无关。。。请发布与您所问问题相关的代码。我将立即测试它。最后一件事,请,因为我真的很难做到这一点之前,测试。如何仅在用户名之间没有空格时读取第5、13列。让我们假设第5列或第13列中有一行用户名,如:
stack overflow\u user\u 7
要跳过吗?因此,它将只读取没有(空格)的行。实际上,如何包含保留字,如果在第5/13列中存在这些字中的任何一个或两个字,那么这些保留字将被忽略?单词1,单词2等等?你最好把它作为一个单独的问题来问。您需要指定输入和输出,以及如何处理这10行-是否应该解析更多行?基本上,我希望避免在第5列或第13列中存在具有特定名称的行,或者即使这两行都存在。如果这些列中存在保留字,我是否可以将其忽略?是的。如果忽略行,则获取其余行,直到它收集10个包含数据的有效行。
Array
(
    [0] => Array
        (
            [0] =>  201
            [1] => stackoverflow_user_7
            [2] => stackoverflow_usersecond
        )

    [1] => Array
        (
            [0] =>  201
            [1] => stackoverflow_user_8
            [2] => stackoverflow_userthird
        )