【问题标题】:how to insert data while looping and inside array as well如何在循环和数组内部插入数据
【发布时间】:2018-06-28 15:02:28
【问题描述】:

这是我的餐桌顺序:

+-------+-------+ |月 |计数 | +-------+-------+ | 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 />";
}

【问题讨论】:

    标签: php mysql arrays fusioncharts


    【解决方案1】:

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

    array_push($arrData2["data"]
    

    您仍然会得到一个仅包含从数据库返回的月份的数组。

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

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

    您现在有一个数组,其中包含从 1 到 12 的 12 个元素(月),所有元素的值都为 false。 (如果需要,您可以使用任何值、数组或 false)。 现在在你的结果循环中,只需替换你有值的数组元素:

    $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);
    

    【讨论】:

    • 我已经编辑了我的答案以满足您的需求。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-11-27
      • 1970-01-01
      • 2018-09-26
      • 1970-01-01
      • 2019-10-18
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多