Php 使用SQL和Codeigniter返回一个4维数组
我需要做一个查询,得到某种数据。我有2个表,用户和连接,我需要获得每个用户每月和每年的连接次数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=
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我用我所做的编辑了这篇文章。你提出解决方案的方式对我帮助很大。我可以让你的想法适应我的算法,太棒了。我真的很高兴我能帮助你朝着正确的方向前进。