如何格式化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 数据库(我会这样做),但这应该能让您入门。我确实测试了这段代码,所以如果你正在考虑这类事情,它应该能满足你的需求。
因此,我有一个 .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 数据库(我会这样做),但这应该能让您入门。我确实测试了这段代码,所以如果你正在考虑这类事情,它应该能满足你的需求。