【问题标题】:Fill missing array elements with zero values for Flot用 Flot 的零值填充缺失的数组元素
【发布时间】:2023-03-18 03:09:01
【问题描述】:

我正在 PHP 中创建一个数组以发送回前端以在 Flot 折线图中显示。我有应该按月显示的数据。如果我的 SQL 语句没有找到给定月份的任何值,则该月份没有数组元素,并且 Flot 图表没有绘制该月份的数据点(参见下面屏幕截图中的 Mar 和 Apr)。我希望它在没有数据的月份显示零数据点。

这是我创建数组的方式:

        $array = array();
        $array['data'] = Array();
        $array['label'] = $tags[0]['tag_name'];

        foreach($tags as $key=>$value) {                
            $month = $value['month'];
            $arr = Array($month, $value['trans_amount']);
            array_push($array['data'], $arr);
        }

当前输出:

{"data":[[1,"75.00"],[2,"170.00"],[5,"100.00"]],"label":"example label"}

期望的输出:

{"data":[[1,"75.00"],[2,"170.00"],[3, "0"],[4, "0"],[5,"100.00"]],"label":"example label"}

这是图表当前与当前输出一起显示的方式:

【问题讨论】:

  • 当您尝试输出 $month 变量时,您是否获得了 1-5 个月?你的 $tags 数组是什么样子的?
  • 我只得到 1、2 和 5,因为这是数据库中唯一的数据。为此无需进行任何更改,我只需要修改我的 PHP 以用零值填充数组中的空白。

标签: php arrays flot


【解决方案1】:

这行得通。这是对 foreach 循环的轻微修改。您需要一个额外的变量 $monthVal 来跟踪当前月份。

//Assuming this the month uptil which you want the data.
    $current_month = 7;
    $monthVal = 1;
    foreach($tags as $key=>$value) {                
        $month = $value['month'];
        if($month != $monthVal){
            while($month != $monthVal){
                $array['data'][] = Array($monthVal, "0");
                $monthVal += 1;
            }
        }
        $arr = Array($month, $value['trans_amount']);
        array_push($array['data'], $arr);
        $monthVal += 1;
    }
    //This loop is added to append the array if the last entry is not equal to $current_month.
    while($monthVal <= $current_month){
        $array['data'][] = Array($monthVal, "0");
        $monthVal += 1;
    }

【讨论】:

  • 好的,这似乎有一个例外:当最后一个月为空时,它似乎没有添加零数组元素。在我最初给出的示例中,如果我要将代码更改为当前月份是 7 月的位置,那么最后一个月的数据是 5 月,它不会添加 6 月和 7 月的元素。我也有一个可用的当月变量($cur_month),这可能有助于解决这个问题。我最初的想法是将整个事情包装在一个while循环中,即while $monthVal
  • @hyphen 如果我理解正确,我认为您需要截至当前月份的数据。您可以在新的 while 循环中的 foreach 循环之后使用 $current_month 变量。检查编辑。
【解决方案2】:

这应该可以。我要做的是检查是否缺少月份,然后将该月份填充为零作为值。

$currMonth = 1;
foreach($tags as $key=>$value) {                
    $month = $value['month'];
    if($month != $currMonth){
        //if we are missing some months populate that month with zero as value
        while($month != $currMonth){
            array_push($array['data'],Array($currMonth, "0"));
            $currMonth++;
        }
    }
    $arr = Array($month, "'" . $value['trans_amount'] . "'");
    array_push($array['data'], $arr);
    $currMonth++;
}

echo json_encode($array);

【讨论】:

    【解决方案3】:

    我会更改您的 SQL 查询以返回更多数据,如果它存储为日期。 尝试将日期保持为日期而不是整数。 PHP 和 SQL date 函数广泛而有用。

    这个简单的for 循环将在foreach 之前用SQL 查询中的缺失数据填充数组。

    for($i=1;$i<=12;$i++){
        if(!isset($tags[$i])){
           $tags[$i]['month'] = $i;
           $tags[$i]['trans_amount'] = 0;
        }
    }
    foreach($tags as $key=>$value) {                
        $month = $value['month'];
        $arr = array($month, $value['trans_amount']);
        array_push($array['data'], $arr);
    }
    

    【讨论】:

      【解决方案4】:

      试试这个(适用于 PHP 5.3+):

      $array = array();
      $month_min = $month_max = 0;
      foreach($tags as $value) {
          $month = $value['month'];
          $array[$month - 1] = array($month, $value['trans_amount']);
          $month_max = $month;
          if (!$month_min) $month_min = $month;
      }
      
      $months = array_values(array_map(function ($v) { return intval($v['month']); }, $tags));
      $months_range = range(1, $month_max);
      
      foreach (array_diff($months_range, $months) as $month) {
          $array[$month - 1] = array($month, 0);
      }
      
      $result = array(
          'data' => array_slice($array, $month - 1),
          'label' => $tags[0]['tag_name'],
      );
      print_r(json_encode($result));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-07
        • 1970-01-01
        • 2016-08-26
        • 2014-03-02
        • 1970-01-01
        • 2023-01-31
        • 1970-01-01
        • 2011-08-21
        相关资源
        最近更新 更多