如何格式化PHP中的特定字符串数据?

How to format a specific string of data in PHP?

因此,我有一个 .txt 文件,其中包含我网站上某个程序的使用数据。格式如下:

~input|methodUsed|User|userInfo|month|day|year|hour|minute\n

每次有人使用该程序时,它都会将这一行添加到文本文件中。我正在处理统计页面。我想知道三件事:

如何管理条目的字符串(使用file_get_contents)到:

获取特定日期的使用次数(比如 08|17|17

在那一天,获得最常见的用户and/or输入

总的来说,获得最常见的用户and/or输入

我认为查找最常见用户和最常见输入之间的代码差异几乎没有。任何人都可以帮助我完成 PHP 中的任何一项或所有这三项任务吗?我知道 PHP 的 explode() 函数并假设这是完成此任务所必需的。我知道这种处理数据的方式不是最好的,但我真的不想改变它。我以这种方式存储了几个月的数据。如果我未能添加完成任务所需的任何信息,请告诉我。

就像马里奥建议的那样,您可以轻松地将数据放入数据库中,这将使获取您正在寻找的统计数据变得非常简单。我将向您展示一个使用 SQLite3 数据库执行此操作的示例。

首先,您需要导入数据。您可以使用 file_get_contents,但因为我必须对此进行测试,所以我只是从字符串中导入它,并且因为我不知道您的数据到底是什么样子,所以我只是做了:

$db = new SQLite3( __DIR__ . '/logs.db');
$db->exec('
    CREATE TABLE log (
        input TEXT,
        methodUsed TEXT,
        User TEXT,
        userInfo TEXT,
        datetime TEXT
    )
');

$str = "~a|3|Bob|aaa|12|04|2000|23|05\n
~b|6|Bill|bbb|08|18|2017|14|18\n
~c|4|Tina|ccc|09|28|2016|16|33\n
~d|7|Doug|ddd|11|07|2017|08|24\n
~e|1|Fred|eee|01|22|2015|00|16\n";

// Get an array of lines
$lines = explode( PHP_EOL, $str );

// Loop through the lines
foreach( $lines as $line )
{
    if( ! empty( $line ) )
    {
        list(
            $input,
            $methodUsed,
            $User,
            $userInfo,
            $month,
            $day,
            $year,
            $hour,
            $minute
        ) = explode( '|', $line );

        $dateTime = date('Y-m-d H:i:s', strtotime($year . '/' . $month . '/' . $day . ' ' . $hour . ':' . $minute . ':00' ) );

        $db->exec("
            INSERT INTO log (input, methodUsed, User, userInfo, datetime) 
            VALUES (\"$input\",\"$methodUsed\",\"$User\",\"$userInfo\",\"$dateTime\")
        ");
    }
}

现在有了一个包含数据的数据库,进行查询以提供您想要的统计数据真的很容易。您再次获得连接:

$db = new SQLite3( __DIR__ . '/logs.db');

这只是选择每行中的所有用户

$results = $db->query('SELECT User FROM log');

这将从日期时间在过去 6 个月内的所有行中选择全部

$results = $db->query('SELECT * FROM log WHERE datetime > datetime("now", "-6 months")');

这将从日期时间在特定日期的所有行中选择全部

$results = $db->query('SELECT * FROM log WHERE date(datetime) = "2017-08-18"');

获取特定日期最常访问的用户

$results = $db->query('SELECT User, COUNT(*) as cnt FROM log WHERE date(datetime) = "2017-08-18" GROUP BY User ORDER BY cnt DESC LIMIT 1');

获取所有记录中最常见的用户

$results = $db->query('SELECT *, COUNT(*) as cnt FROM log GROUP BY User ORDER BY cnt LIMIT 1');

最后,显示以上任一结果的结果(一次选1个):

while( $row = $results->fetchArray(SQLITE3_ASSOC) )
{
    echo '<pre>';
    print_r( $row );
    echo '</pre>';
}

我确定您想要进行自己的修改,或者可能改用 MySQL 数据库(我会这样做),但这应该能让您入门。我确实测试了这段代码,所以如果你正在考虑这类事情,它应该能满足你的需求。