如何在循环和内部数组中插入数据

时间:2018-01-19 11:20:01

标签: php mysql arrays fusioncharts

这是我的表格顺序:

+-------+-------+
| month | count |
+-------+-------+
|     6 |    11 |
|    11 |    27 |
|    12 |     9 |
+-------+-------+

我想使用fusioncharts创建图表。让我们说这一年是2017年。我如何将缺失的月份放入我使用的哪种融合图中?我坚持这个条件。

这是我的代码:

$strQuery2 = "SELECT DATE_FORMAT(order_date, '%c') as month, COUNT(*) AS cnt FROM orders where YEAR(order_date)='2017' GROUP BY month  ORDER BY `month` DESC";
$result2 = $dbhandle->query($strQuery2);
// Push the data into the array
while($row2 = $result2->fetch_assoc()) {
    $q = $row2["month"];
    $w = $row2["cnt"];
    $e = 0;
    $x = 1;
    if ($x != $q){
        echo "true";
        array_push($arrData2["data"],
            array(
                "label" => $row2[$x],
                "value" => $row2[$e]
            )
        );
    }
    else{
        echo "false";
        array_push($arrData2["data"],
            array(
                "label" => $row2["month"],
                "value" => $row2["cnt"]
            )
        );
    }
    $x++;
    echo $row2["month"] . "<br />";
    echo $row2["cnt"] . "<br />";
}

2 个答案:

答案 0 :(得分:0)

你永远不会从不存在的数据库中获得一个月。如果将数据推送到空数组:

Get-ChildItem -Path "C:\temp" -File |
    Where-Object BaseName -like "*[0-8][0-9]"

你仍然得到一个只包含从数据库返回的月份的数组。

您可以做的是首先创建一个包含所有12个月的数组:

C:\temp

现在你有一个包含12个元素(月)的数组,从1到12,所有数值都为array_push($arrData2["data"] 。 (如果需要,您可以使用任何值,数组或false)。 现在在resultloop中,只需替换您具有以下值的数组元素:

$arrData2["data"]=range(1,12,false);

$ arrData2现在看起来像:

false

现在,您可以替换值为$arrData2["data"][$row2["month"]] = array( 'label' => $row2["month"], 'value' => $row2["cnt"] );

的数组的所有array( 1 => false, 2 => false, 3 => false, 4 => false, 5 => false, 6 => array('label'=> 6,'value'=> 11), 7 => false, 8 => false, 9 => false, 10 => false, 11 => array('label'=> 11,'value'=> 27), 12 => array('label'=> 12,'value'=> 9) )

所以你的整个代码可以抄袭:

false

答案 1 :(得分:0)

基本上有两种方法可以解决它。一个用于填补PHP方面的缺失月份,另一个用于SQL。我会给你SQL版本:

SELECT
    m.`month`,
    IFNULL(x.cnt, 0) AS cnt
FROM
    (SELECT 1 AS `month` UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12) AS m
    LEFT JOIN (SELECT DATE_FORMAT(order_date, '%c') as `month`, COUNT(*) AS cnt FROM orders where YEAR(order_date)='2017' GROUP BY `month`) AS x ON m.`month` = x.`month`
ORDER BY m.`month` DESC

它基本上生成从1到12的所有月份的列表,如果您的查询中存在这样的月份,那么它将填充实际值。否则它就是零。