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

时间:2017-08-20 05:05:28

标签: php database string explode

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

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

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

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

获取特定日期的用途(例如08|17|17

在那一天,获取最常见的用户和/或输入

总的来说,获得最常见的用户和/或输入

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

1 个答案:

答案 0 :(得分:1)

就像马里奥所暗示的那样,你可以轻松地将数据放入数据库中,这样可以很容易地获得你想要的统计数据。我将向您展示使用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数据库(这就是我要做的),但这应该让你开始。我测试了这段代码,所以如果你正在考虑这类事情,它应该满足你的需求。