【问题标题】:Adding months in array which are missing在数组中添加缺少的月份
【发布时间】:2018-08-18 06:29:33
【问题描述】:

我有一个 SQL 表,我从中返回月份和视图。 查询:

   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();
  }

EDIT:上面的函数返回这个

    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
 )

PHP

$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
月份:2018 年 10 月:观看次数:1
:2019 年 1 月:观看次数:2
:2019 年 2 月:观看次数:8
:2019 年 7 月:观看次数:14

我想要的是插入缺少的月份,views=0 如果结果中不存在月份:

:2018 年 8 月:观看次数:19
:2018 年 9 月:观看次数:0 - 这不在表格中。我分配给 0
:2018 年 10 月:观看次数:1
:2018 年 11 月:观看次数 : 0 - 这不在表格中。我分配给 0
Month:2018 年 12 月:Views:0 - 这不在表格中。我分配给 0

我遵循了这个答案,这是我想要的解决方案,但需要多年。如果您看到此答案,您将找不到年份,因此可以通过创建值 = 0 的月份数组之前和之后用数据库值覆盖它来轻松操作它
链接:Query missing months in which we haven't sold anything?

【问题讨论】:

  • 只需在循环中添加一个计数器。每当行结果与计数器不匹配时,打印 0。
  • 感谢您的回复 :) 请检查上面的编辑。我应该匹配什么?如果它不存在,我必须插入一个密钥。你能提供一个解决方案吗?这对我很有帮助!

标签: php mysql arrays


【解决方案1】:

大概是这样的?
我从键的开头循环到键的结尾作为 strtotime。

我使用 array_search 来查看是否在值中找到它,如果不添加零值,则添加值。

$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】:

    你可以使用for循环

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

    【讨论】:

    • 感谢您的回复 scaisEdge :) 请检查上述编辑。实际上返回的结果不是同一年。年份也会改变。您发布的答案并没有给我在索引中添加月份的解决方案,就像应该有一个键 '2018 September ' 在键 august 之后的值为零
    • @MuhammadOsama 循环仍然有效 .. 但你应该从你需要的月份开始显示结果 .. 例如:9 到 12 然后从 1 到 8 ..
    • 上面的解决方案是打印上面的结果:((截图链接)附prntscr.com/kk1uf7
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2017-10-03
    • 2013-06-24
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多