代码之家  ›  专栏  ›  技术社区  ›  Muhammad Osama

在数组中添加缺少的月份

  •  -1
  • Muhammad Osama  · 技术社区  · 7 年前

    查询:

       function chartData(){
       $q=$this->db->select("DATE_FORMAT(insertTime,'%Y-%M') as Month , count(*) as value")
                ->group_by("DATE_FORMAT(insertTime,'%Y %M')")
                ->get('users');
     return $q->result();
      }
    

    :上面的函数返回

        Array
     (
        [0] => stdClass Object
            (
            [Month] => 2018-August
            [value] => 21
     )
    
        [1] => stdClass Object
     (
            [Month] => 2018-October
            [value] => 3
     )
    
        [2] => stdClass Object
     (
            [Month] => 2018-September
            [value] => 3
     )
    
        [3] => stdClass Object
     (
            [Month] => 2019-January
            [value] => 1
     )
    
        [4] => stdClass Object
     (
            [Month] => 2019-October
            [value] => 1
     )
    

    菲律宾比索

    $data=$this->users->chartData();
        $keys=array();
        $values=array();
        foreach ($data as $d) {
            array_push($keys, $d->Month);
            array_push($values, $d->value);
        }
    
        $results['keys']=json_encode($keys);
        $results['values']=json_encode($values);
    
        print_r($results['keys']);
        // returns ["2018-August","2018-October","2018-September","2019-January","2019-October"]
        print_r($results['values']);
        // returns ["21","3","3","1","1"]
    

    简化形式:

    :2018年8月: :19个
    意见 :1个
    :2019年1月: :2个
    :2019年2月: 意见 :8个
    :2019年7月: 意见

    我想插入视图为0的缺失月份

    意见 :19个
    :2018年9月: 意见 :0-这不在表中。我分配给0
    :2018年10月: 意见 :1个
    意见 :0-这不在表中。我分配给0
    :2018年12月: :0-这不在表中。我分配给0

    我遵循了这个答案,这是我想要的解决方案,但用了好几年。如果您看到这个答案,您将无法找到year,因此通过在使用数据库值覆盖之前和之后创建值为0的months数组很容易处理它
    链接: Query missing months in which we haven't sold anything?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Andreas    7 年前

    也许是这样?

    我使用array_search查看是否在value s中找到,如果不加零值,则加上值。

    $keys = ["2018-August","2018-October","2018-September","2019-January","2019-October"];
    $values = [21,3,3,1,1];
    
    For($i= strtotime($keys[0]); $i<=strtotime(end($keys)); $i+=86400*31){
        $search = array_search(date("Y-F", $i), $keys);
        if($search !== false){
            $new[$keys[$search]] = $values[$search];
        }else{
            $new[date("Y-F", $i)] =0;
        }
    }
    $new[end($keys)] = end($values); //add last item since I loop between the dates
    Var_dump($new);
    

    输出:

    array(15) {
      ["2018-August"]=>
      int(21)
      ["2018-September"]=>
      int(3)
      ["2018-October"]=>
      int(3)
      ["2018-November"]=>
      int(0)
      ["2018-December"]=>
      int(0)
      ["2019-January"]=>
      int(1)
      ["2019-February"]=>
      int(0)
      ["2019-March"]=>
      int(0)
      ["2019-April"]=>
      int(0)
      ["2019-May"]=>
      int(0)
      ["2019-June"]=>
      int(0)
      ["2019-July"]=>
      int(0)
      ["2019-August"]=>
      int(0)
      ["2019-September"]=>
      int(0)
      ["2019-October"]=>
      int(1)
    }
    
        2
  •  1
  •   ScaisEdge    7 年前

    $data=$this->users->chartData();
    $keys=array();
    $values=array();
    for ($cnt = 0; $cnt<12; $cnt++){
      if (isset($data[$cnt])){
        $keys[$cnt] = $cnt;
        $values[$cnt] = $data[$cnt]['value'];
      } else {
        $keys[$cnt] = $cnt;
        $values[$cnt] = 0;
      }
    }