【问题标题】:Adding zero values to an array向数组添加零值
【发布时间】:2023-04-10 16:18:01
【问题描述】:

我正在对包含各种客户订单的数据库执行以下查询。

SELECT WEEKDAY(orderDateTime) Date, COUNT(clientID) totalCount FROM orders WHERE YEARWEEK(orderDateTime,1) = YEARWEEK(NOW(),1) GROUP BY DATE(orderDateTime)

SELECT WEEKDAY(orderDateTime) Date, COUNT(clientID) totalCount FROM orders WHERE YEARWEEK(orderDateTime,1) = YEARWEEK(NOW() - INTERVAL 1 WEEK,1) GROUP BY DATE(orderDateTime)

SELECT DATE_FORMAT(orderDateTime, '%Y') as 'year', DATE_FORMAT(orderDateTime, '%m') as 'month', COUNT(clientID) as 'total' FROM orders GROUP BY DATE_FORMAT(orderDateTime, '%Y%m')

我正在将它们构建成一个数组,其中包含月/日数字与计数值:

[[0, 1], [1,4]...]

我正在使用 Flot 来绘制这些图表,但发生的情况是,任何没有订单的日子或月份都没有任何价值(显然)所以你得到的是这样的:

[[0, 1], [1,4], [6,12]] 导致图表错误。

试图解决的是如何填充它,使其看起来像:

[[0, 1], [1,4], [2,0], [3,0], [4,0], [5,0], [6,12]]

[[1, 1], [2,4], [3,0], [4,0], [5,0], [6,0], [7,12], [8,0 ], [9,12], [10,0], [11,0], [12,0]]

我主要使用 PHP。如果我不是那么清楚,任何指针将不胜感激和抱歉。询问您是否需要任何澄清。

PHP:

$thisWeekA = array();

$thisWeekQ = $database->query("SELECT WEEKDAY(orderDateTime) Date, COUNT(clientID) totalCount FROM orders WHERE YEARWEEK(orderDateTime,1) = YEARWEEK(NOW(),1) GROUP BY DATE(orderDateTime)")->fetchAll();

foreach($thisWeekQ as $thisweek){
    $thisWeekA[] = array( $thisweek['Date'], $thisweek['totalCount'] );
}

array(2) {
  [0]=>
  array(4) {
    ["Date"]=>
    string(1) "2"
    [0]=>
    string(1) "2"
    ["totalCount"]=>
    string(1) "3"
    [1]=>
    string(1) "3"
  }
  [1]=>
  array(4) {
    ["Date"]=>
    string(1) "3"
    [0]=>
    string(1) "3"
    ["totalCount"]=>
    string(1) "2"
    [1]=>
    string(1) "2"
  }
}

【问题讨论】:

  • 所以你需要你的 php 输入数据来处理要处理的浮点图。为了更多的理解,你可以分享你用来准备图形输入数据的 php 代码
  • 请在您的问题中更新此内容
  • 在每周图表上 [0(星期日),12(订单数)] 对吗?
  • 是的,没错。
  • 对不起,当我写我现在删除的答案时,我以为这是标记为 javascript。

标签: php sql flot


【解决方案1】:

对于每周数据,在你的 php 中使用 for 循环将其更新为, 逻辑一周只有 7 天,而不是从结果数据中使用 foreach,我们可以使用 for 循环 7 天

也就是说,同样使用多年

$thisWeekA = array();    
$thisWeekQ = $database->query("SELECT WEEKDAY(orderDateTime) Date, COUNT(clientID) totalCount FROM orders WHERE YEARWEEK(orderDateTime,1) = YEARWEEK(NOW(),1) GROUP BY DATE(orderDateTime)")->fetchAll();

    for ($i = 0; $i <= 6; $i++) {
        if ($thisWeekQ[$i]['Date'] == $i) {
            $thisWeekA[$i][] = array($thisWeekQ[$i]['Date'], $thisWeekQ[$i]['totalCount']);
        } else {
            $thisWeekA[$i][] = array($i, 0);
        }
    }

【讨论】:

  • 我已经添加了查询输出的样子。
  • 对不起,我的评论不是很清楚!由于它查看数组编号而感到困惑,这意味着它永远不会与订单计数匹配。我所有的数字都是 0。
【解决方案2】:

您可能想考虑更多地像这样构建数组:

var dow = [];
dow[0] = 1;
dow[1] = 4;
dow[6] = 12;

此时您可以为图表填充数组

var chartData = [];
for (var i=0; i<7; i++){
    chartData[i] = [i, (dow[i] === undefined ? 0 : dow[i])];
}

【讨论】:

    【解决方案3】:

    我设法找到了一种方法。感谢您为我指明 For 循环的方向!

    这就是我想出的方法!

    function arrayhunt($products, $field, $value){
    
       foreach($products as $key => $product){
    
            if ($product[$field] == $value){
                return $key;
            }
       }
       return false;
    }
    
    
        $i = 0;
        for ($i = 0; $i <= 6; $i++) {
    
            $keys = arrayhunt($thisWeekQ,"Date",$i);
    
            if($keys !== FALSE){
                $thisWeekA[] = array($thisWeekQ[$keys]['Date'], $thisWeekQ[$keys]['totalCount']);
            } else {
                $thisWeekA[] = array($i, 0);
            }
    
            $keys = "";
        }
    

    希望以后有人会发现这很有用。

    【讨论】:

      猜你喜欢
      • 2013-12-13
      • 2017-11-16
      • 2017-03-14
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 2012-07-04
      相关资源
      最近更新 更多