首页 > 解决方案 > 将 PHP 数组发送到 JSON 时,我应该删除前导“0”吗?

问题描述

我的项目是用“Chart.Js”创建一个条形图。

该图表应显示基于一年中所有周的记录。数据来自 MySQL 中的 datetime 列。

我是这样做的:
首先我在 MySQL 中选择:

$query = "SELECT datetime_start FROM table WHERE datetime_start LIKE '2020%' ORDER BY datetime_start ASC";

现在我有这样的记录:2020-03-12 09:38:00

要将日期分组为几周,我这样做:

while($row = $stmt->fetch()){
    
    $date = new DateTime($row['datetime_start']);
    $week = $date->format("W");
    
    $data[$week]++;
}

从这里我将它发送给 JS:echo json_encode($data);

在 JS 中,我做了console.log(result)一个列表,其中键代表一周,值是我在那周有多少个日期。

这就是我的问题发生的地方!该列表已排序:

{10: 42, 11: 40, 12: 40, 13: 44, 14: 26, 15: 33, 16: 27, 17: 31, 18: 21, 19: 21, 20: 20, 21: 22, 22: 25, 23: 22, 24: 19, 25: 7, 26: 9, 27: 6, 28: 1, 29: 6, 30: 5, 31: 7, 32: 1, 33: 5, 34: 5, 35: 6, 36: 4, 37: 2, 38: 2, 39: 4, 40: 2, 41: 3, 42: 2, 43: 3, 44: 3, 45: 3, 46: 2, 47: 2, 48: 6, 49: 4, 50: 4, 51: 2, 52: 2, 53: 1, 01: 23, 02: 25, 03: 34, 04: 43, 05: 31, …}

第 10 周在第 1 周之前。这将导致我的图表如下所示:

在此处输入图像描述

哪种方法最好解决这个问题?

我检查了 Php.net 中的日期时间对象,该对象在周数 ( format('w')) 中没有前导零,但它不存在。

我应该用 PHP 或 JS 删除前导零来解决这个问题吗?我认为 PHP 数组从 01 开始是正确的,但是当我将其解码为 JSON 时,顺序会发生变化,并且 10 将成为对象中的第一个键?!

编辑

我的 PHP 看起来不错:

Array ( [01] => 23 [02] => 25 [03] => 34 [04] => 43 [05] => 31 [06] => 37 [07] => 32 [08] => 34 [09] => 45 [10] => 42 [11] => 40 [12] => 40 [13] => 44 [14] => 26 [15] => 33 [16] => 27 [17] => 31 [18] => 21 [19] => 21 [20] => 20 [21] => 22 [22] => 25 [23] => 22 [24] => 19 [25] => 7 [26] => 9 [27] => 6 [28] => 1 [29] => 6 [30] => 5 [31] => 7 [32] => 1 [33] => 5 [34] => 5 [35] => 6 [36] => 4 [37] => 2 [38] => 2 [39] => 4 [40] => 2 [41] => 3 [42] => 2 [43] => 3 [44] => 3 [45] => 3 [46] => 2 [47] => 2 [48] => 6 [49] => 4 [50] => 4 [51] => 2 [52] => 2 [53] => 1 )

JSON 变得混乱:

{10: 42, 11: 40, 12: 40, 13: 44, 14: 26, 15: 33, 16: 27, 17: 31, 18: 21, 19: 21, 20: 20, 21: 22,…}

标签: javascriptphpchart.js

解决方案


不要使用关联数组,使用索引数组。首先创建一个包含 53 个元素的数组,然后在循环中更新它。

$data = array_fill(0, 53, 0);
while($row = $stmt->fetch()){

    $date = new DateTime($row['datetime_start']);
    $week = $date->format("W");

    $data[intval($week)]++;
}

推荐阅读