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

qlckcl4x  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(304)

这是我的餐桌点菜:

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

我想用fusioncharts创建一个图形。假设今年是2017年。如何将缺少的月份放入我正在使用的fusioncharts数组中?我被困在这个条件下。
这是我的密码:

$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 />";
}
rnmwe5a2

rnmwe5a21#

基本上有两种方法。一个用于填补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的所有月份的列表,如果您的查询中存在这样的月份,那么它将填充实际值。否则是零。

vktxenjb

vktxenjb2#

你永远不会从数据库里得到一个月的时间。如果将数据推入空数组:

array_push($arrData2["data"]

您仍然会得到一个只包含从数据库返回的月份的数组。
您可以先创建一个包含所有12个月的数组:

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

现在有了一个数组,它包含12个从1到12的元素(月),所有元素的值都是 false . (如果需要,可以使用任何值(数组或false)。现在,在resultloop中,只需替换具有以下值的数组元素:

$arrData2["data"][$row2["month"]] = array(
      'label' => $row2["month"],
      'value' => $row2["cnt"]
      );

$arrdata2现在看起来像:

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 具有值的数组的值 0 所以你的整个代码可以被设定为:

//set empty array
$arrData2['data'] = range(1, 12, false);

//fill elements we know
while($row2 = $result2->fetch_assoc()) {
    $arrData2["data"][$row2["month"]] = array(
      'label' => $row2["month"],
      'value' => $row2["cnt"]
      );
    }

//replace the rest with 0
foreach($arrData2["data"] as $key => $value){
    // skip what we already know
    if($values !== false) continue;
    // replace the rest
    $arrData2["data"][$key]=array(
                              'label'=>$key,
                              'value'=> 0
                              );
}
echo print_r($arrData2,true);

相关问题