在数组中添加缺少的月份

时间:2018-08-18 06:29:34

标签: php mysql arrays

我有一个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();
  }

编辑:上面的函数返回此值

    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
:2018年12月:观看次数:0-不在表格中。我分配给0

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

2 个答案:

答案 0 :(得分:1)

您可以使用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;
  }
}

答案 1 :(得分: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)
}