我有列date_added,其格式为2017-02-09 08:45:48。我想在同一个月内存储同月的所有记录,比如2月份的记录应该在Feb数组中。我正在尝试使用代码。
$Res = array();
$query = $this->pdoConnection->prepare("select id,date from `record` ");
$query->execute();
header("Content-type: application/json; charset=utf-8");
$month = array(1,2,3,4,5,6,7,8,9,10,11,12);
while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
$Data = $row;
$array_date = date("m", strtotime($row['date']));
$alpha_month = date("M", strtotime($row['date']));
if(in_array($array_date,$month)){
$Res[] = array($alpha_month=>array($Data));
}
}
$output = array(
'response' => $Res
);
echo json_encode($output,JSON_PRETTY_PRINT);
结果
{
"response": [
{
"Jan": [
{
"id": "1",
"date_added": "2017-01-03 08:43:09"
}
]
},
{
"Feb": [
{
"id": "4",
"date_added": "2017-02-04 10:53:44"
}
]
},
{
"Feb": [
{
"id": "2",
"date_added": "2017-02-12 08:59:15"
}
]
}
]
}
正如你所看到的,我的代码是返回2月的单独数组,但我想存储两个内部的Feb数组。我尝试过不同的逻辑,但仍面临同样的问题。
答案 0 :(得分:0)
你可以尝试
$Res[$alpha_month][] = $data;
这只会在当月为您的数组添加一个条目,您也不再需要if(in_array($array_date,$month))
答案 1 :(得分:0)
对我上面的简短评论稍微详细一点:
而是$ Res [] = array($ alpha_month => array($ Data));你可以做$ Res [$ alpha_month] [] = $ Data;
目前你在这个while循环中获取所有结果元组,这是准确和正常的。但是如果你想将一些结果“分组”在一个数组中,可以采用的方法之一是:
$Res[$alpha_month][] = $Data;
使用此代码,您可以“推送”$ Res数组中的结果($ Data)。重要的部分是第一个与新结构相关的数组层$Res[$alpha_month]
:
array('JAN', 'FEB', ...);
第二个[]
为第一层声明,在这种情况下,它是您的月份组,另一个数组。您可能会在第一次推送每月结果时获得PHP WARNINGS
,因为$Res[$alpha_month][]
会在您的数组中导致两级声明。
在第一个声明中,如前所述,您将所有组/月推入阵列!但同时,php期望第一次迭代,也是一个数组:($Res[$alpha_month][]
)
所以干净的解决方案如下:
if(!isset($Res[$alpha_month])){
$Res[$alpha_month] = array(); // You can also use []; instead array();
}
$Res[$alpha_month][] = $Data;
使用该片段,您首先检查$Res[$alpha_month]
是否存在 - 如果当前图层不可用,也会声明一个数组。