我已制作了一个脚本来跟踪我网站上的访问者,现在我想用JSON显示每日访问量。
这是我编写的一些PHP代码,用于在数组中显示当天访问者的日期和数量:
$dateQuery = $db->prepare("SELECT date FROM tracked");
$dateQuery->execute();
$rows = $dateQuery->fetchAll(PDO::FETCH_ASSOC);
$array = array();
foreach ( $rows as $row ) {
$day = explode(' ', $row['date']);
if ( !key_exists($day[0], $array) ) {
$array[$day[0]] = 0;
}
$array[$day[0]] += 1;
}
这是我print_r
数组时的输出:
现在要将此输出用于Google Charts API,我需要JSON格式如下:
[["2016-02-18",6],["2016-02-17",5]]
相反,我得到了json_encode($ array):
{"2016-02-17":5,"2016-02-18":6}
我现在对数组和循环有了基本的了解,但我似乎无法想出解决问题的解决方案。
答案 0 :(得分:1)
刚写了一些简单的代码来转换你的数组。
<?php
$array = [];
$array['2016-01-17'] = 7;
$array['2016-02-18'] = 6;
echo json_encode($array); // output is: {"2016-01-17":7,"2016-02-18":6}
$arrayInRightFormat = [];
foreach ($array as $i => $value) {
$arrayInRightFormat[] = [$i, $value];
}
echo json_encode($arrayInRightFormat); // output is: [["2016-01-17",7],["2016-02-18",6]]
Defacto你使用你的数组就像一个带有字符串键的HashMap,所以它被转换为一个字典。
更好的想法是让mysql数据库聚合数据,然后将其直接转换为正确的格式!
<?php
$dateQuery = $db->prepare("SELECT DATE(date) as day,count(*) as hits FROM tracked GROUP BY DATE(date)");
$dateQuery->execute();
$rows = $dateQuery->fetchAll(PDO::FETCH_ASSOC);
$array = array();
foreach ( $rows as $row ) {
$array[] = [$row['day'], $row['hits']];
}
echo json_encode($array); // output is: [["2016-01-17",7],["2016-02-18",6]]
答案 1 :(得分:1)
您可以在一开始就轻松优化查询,使您的数据看起来完全像您需要的,而不会在以后出现不必要的循环:
$dateQuery = $db->prepare("SELECT
DATE(date) AS date,
COUNT(tracked.id) AS count
FROM tracked
GROUP BY DATE(date)");
$dateQuery->execute();
$rows = $dateQuery->fetchAll(PDO::FETCH_ASSOC);
(我不知道你的桌子是否有一个&#34; id&#34;列,但我确定你明白了这一点)。然后它就像
一样简单$result = array();
foreach ( $rows as $row ) {
$result[] = array($row['date'], $row['count']);
}
echo json_encode($result);