Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用SQL和Codeigniter返回一个4维数组_Php_Mysql_Arrays_Codeigniter_Multidimensional Array - Fatal编程技术网

Php 使用SQL和Codeigniter返回一个4维数组

Php 使用SQL和Codeigniter返回一个4维数组,php,mysql,arrays,codeigniter,multidimensional-array,Php,Mysql,Arrays,Codeigniter,Multidimensional Array,我需要做一个查询,得到某种数据。我有2个表,用户和连接,我需要获得每个用户每月和每年的连接次数 users connections ........... ................ john 10/02/2014 john 15/02/2014 john 03/01/2015 john 06/02/2015 是否有机会以这种格式获取此信息: john=

我需要做一个查询,得到某种数据。我有2个表,用户和连接,我需要获得每个用户每月和每年的连接次数

users             connections
...........    ................
john              10/02/2014
john              15/02/2014
john              03/01/2015
john              06/02/2015
是否有机会以这种格式获取此信息:

 john=>
   [0]=>2014
     [0]=>02
       'total' =>2
   [1]=>2015
     [0]=>01
       'total' => 1
     [1]=>02
       'total' => 2
     [2]=>03
       'total'=> 1 
我正在使用Codeigniter和PHP

在回答@CodeGodie问题时,我到目前为止所做的是:

public function getPeriodicity(){
    $this->db->select('u.vusr_user, extract (MONTH from (to_timestamp(c.vuc_log_in))) as month, extract (YEAR from (to_timestamp(c.vuc_log_in))) as yearly, COUNT(c.vuc_log_in)');
    $this->db->from('vts_users_conn c');
    $this->db->join('vts_users u', 'c.vuc_vusr_id = u.vusr_id');
    $this->db->group_by('u.vusr_user, month, yearly','asc');
    $query = $this->db->get();
    return $query->result_array();
  }

作为一般规则,如果你能访问数据并在脑海中看到你想要数据的样子,那么让它这样做几乎是可能的。这只是制定流程的问题

在您的情况下,我将执行以下步骤:

  • 按用户排序数据,然后按日期排序,这样所有内容都能很好地结合在一起
  • 循环浏览数据,每次检查当前用户是否与上一个相同。如果不是,则创建一个新的数组键
  • 将日期拆分为所需的部分
  • 检查用户数组中与该用户的年份相关的密钥。如果存在年份,则搜索月份。如果该月存在,则将该月的总数加1。如果年份和/或月份不存在,请创建键并将该月份的合计设置为1

处理完记录后,您应该拥有所需格式的数据。

假设您使用Codeigniter的
$this->db->result\u array()
获取数据库结果,您的初始数组将如下所示:

$res = array(
    array(
        "name" => "john",
        "date" => "10/02/2014"
    ),
    array(
        "name" => "john",
        "date" => "15/02/2014"
    ),
    array(
        "name" => "john",
        "date" => "03/01/2015"
    ),
    array(
        "name" => "john",
        "date" => "06/02/2015"
    ),
    array(
        "name" => "john",
        "date" => "06/03/2015"
    )
);
为了将此数组更改为所需的输出,我将执行以下操作:

foreach ($res as $row) {
    $date_arr = explode("/", $row['date']);
    $n = $row['name'];
    $y = $date_arr[2];
    $m = $date_arr[1];

    if (!isset($final[$n]))
        $final[$n] = array();

    if (!isset($final[$n][$y]))
        $final[$n][$y] = array();

    if (!isset($final[$n][$y][$m])) {
        $final[$n][$y][$m] = array("total" => 1);
    } else {
        $final[$n][$y][$m]["total"] = $final[$n][$y][$m]["total"] + 1;
    }
}
array (size=1)
  'john' => 
    array (size=2)
      2014 => 
        array (size=1)
          '02' => 
            array (size=1)
              'total' => int 2
      2015 => 
        array (size=3)
          '01' => 
            array (size=1)
              'total' => int 1
          '02' => 
            array (size=1)
              'total' => int 1
          '03' => 
            array (size=1)
              'total' => int 1
如果您
var\u dump
您的最终结果(
var\u dump($final)
),您将得到以下结果:

foreach ($res as $row) {
    $date_arr = explode("/", $row['date']);
    $n = $row['name'];
    $y = $date_arr[2];
    $m = $date_arr[1];

    if (!isset($final[$n]))
        $final[$n] = array();

    if (!isset($final[$n][$y]))
        $final[$n][$y] = array();

    if (!isset($final[$n][$y][$m])) {
        $final[$n][$y][$m] = array("total" => 1);
    } else {
        $final[$n][$y][$m]["total"] = $final[$n][$y][$m]["total"] + 1;
    }
}
array (size=1)
  'john' => 
    array (size=2)
      2014 => 
        array (size=1)
          '02' => 
            array (size=1)
              'total' => int 2
      2015 => 
        array (size=3)
          '01' => 
            array (size=1)
              'total' => int 1
          '02' => 
            array (size=1)
              'total' => int 1
          '03' => 
            array (size=1)
              'total' => int 1

希望这能有所帮助。

可能重复@CodeGodie我用我所做的编辑了这篇文章。你提出解决方案的方式对我帮助很大。我可以让你的想法适应我的算法,太棒了。我真的很高兴我能帮助你朝着正确的方向前进。