问题描述
我试图用酒窝绘制一年中每周的堆积量。
上面的图几乎是我想要实现的,但缺少没有数量的周(例如第 22 周和第 24 周),以及从 #28 到 #52 的所有周。
我添加了一个“周”表,其中列出了从 1 到 52 的所有周。 对周数执行外连接以格式化 x 轴,如第二个图所示。
function utf8ize($d) {
if (is_array($d))
foreach ($d as $k => $v)
$d[$k] = utf8ize($v);
else
return utf8_encode($d);
return $d;
}
$sql="SELECT s.num_week,category,amount_to_plot FROM weeks RIGHT OUTER JOIN
((SELECT WEEK(date,3) AS week,'A' AS category,SUM(amount) AS amount_to_plot FROM amounts_A GROUP BY WEEK(date,3))
UNION (SELECT WEEK(date,'B' AS category,SUM(amount) AS amount_to_plot FROM amounts_B GROUP BY WEEK(date,'C' AS category,SUM(amount) AS amount_to_plot FROM amounts_C GROUP BY WEEK(date,3))
) r
ON s.num_week = r.week WHERE s.num_week!=53 ORDER BY s.date_debut ASC
";
$result = MysqLi_query($connection,$sql) or die("Error in Selecting " . MysqLi_error($connection));
$amounts = array();
while($row =MysqLi_fetch_assoc($result))
{
$amounts[] = $row;
}
$data = json_encode(utf8ize($amounts),JSON_UnesCAPED_UNICODE);
echo $data;
在上面的代码中,通过将“RIGHT OUTER JOIN”替换为“LEFT OUTER JOIN”,也会生成缺失周(即 A、B 或 C 中没有任何金额的那些)的 json 记录以及这就是我们想要的。这些看起来像:
{"num_week":"22","category":"","amount_to_plot":""}
{"num_week":"24","amount_to_plot":""}
{"num_week":"28","amount_to_plot":""}
(...)
{"num_week":"52","amount_to_plot":""}
然而,有一个副作用,图表看起来完全荒谬,以 1 的数量绘制每个数量,包括空值。
我不确定这种副作用是否可能来自“类别”值为空以及要绘制的数量(“”而不是“0.00”)这一事实。
我的问题是如何修补这个? 我对多种方法持开放态度:修改 sql 查询、PHP 代码或凹坑代码。
解决方法
解决了! 有两个罪魁祸首,一个在应用程序级别,另一个在我的 PHP 代码中。
在应用程序级别,问题来自这样一个事实,即酒窝图表库不喜欢要绘制的数量的空值:
... {"num_week":"22","category":"","amount_to_plot":""} ...
使用静态 json 字符串,我可以通过添加“0.00”值确认问题已解决:
... {"num_week":"22","amount_to_plot":"0.00"} ...
但是最简单的解决方案是调整 PHP 代码。
该问题是由我的 PHP 代码中的 utf8ize()
函数引起的,它将空值替换为“0.00”。
代替
$data = json_encode(utf8ize($amounts),JSON_UNESCAPED_UNICODE);
简单使用
$data = json_encode($amounts);
将数据传递给dimple。
然后数据看起来像
...{"num_week":"22","category":null,"amount_to_plot":null} ...
如果 json 字符串被打印出来,直接在 PHP 中回显后,重音字符看起来会很奇怪(因为将使用 utf-8 编码),但它可以完美地作为酒窝图表的数据馈送,也适用于它的传奇。
进一步可能的改进是将 "category":null
替换为 "category":<some-existing-category>
,以避免图例中出现空类别。