我目前有2个数组;
False
-包含当月以来最近12个月的数组
$last_12_months
-包含查询结果,其中包含当月和一个月中进行的约会计数。
我需要能够遍历每个月,并为该月分配约会计数。
当我嵌套循环时,我得到的结果是:
$app12_array_temp
我需要的是:
[0,0,0,0,0,0,0,"1",0,0,0,0,0,0,"4",0,0,0,0,0,0,"2",0,0,0,0,0,0,"15",0,0,0,0,0,0,"9",0,0,0,0,0,0,"8",0,0,0,0,0,0,"2",0,0,0,0,0,0,"1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
我当前的脚本是:
[0,0,0,0,1,4,2,15,9,8,2,1]
因此,如果该月有约会,则应将约会计数添加到数组,否则添加0。 当前,每当没有对应月份的循环时,它将加0
我曾尝试在条件满足时使用Breaks,但会返回0,直到找到该数据为止。
我也有//Loop through months, and check if appointments happened in that month
foreach($last_12_months as $m => $month){
foreach($app_12_array_temp AS $app){
if(date("m", strtotime($app['time'])) == date("m", strtotime($month))){
$app_12_array[] = $app['count'];
break;
}else{
$app_12_array[] = 0;
}
}
}
,但只返回tried In_Array()
这是脚本应该考虑的内容,但是我想不起来如何做到这一点:
[0,0,0,0,1,0,0,0,0,0,0,0]
编辑
Jan -> Any data for this month? -> No, so add 0 for this month to array
Feb -> Any data for this month? -> No, so add 0 for this month to array
Mar -> Any data for this month? -> Yes, so add $app['count'] to array
Apr -> Any data for this month? -> Yes, so add $app['count'] to array
May -> Any data for this month? -> Yes, so add $app['count'] to array
答案 0 :(得分:1)
尝试使用月份作为新数组的键
$app_12_array_temp = [
['time' => '2019-07-27 13:00:00', 'count' => '1'],
['time' => '2019-08-26 13:00:00', 'count' => '2'],
['time' => '2019-09-06 13:00:00', 'count' => '8'],
['time' => '2019-10-22 12:00:00', 'count' => '9'],
['time' => '2019-11-21 12:00:00', 'count' => '15'],
['time' => '2019-12-27 11:00:00', 'count' => '2'],
['time' => '2020-01-22 15:00:00', 'count' => '4'],
['time' => '2020-02-12 09:00:00', 'count' => '1'],
];
$last_12_months = ['Feb', 'Jan', 'Dec', 'Nov', 'Oct', 'Sep', 'Aug', 'Jul', 'Jun', 'May', 'Apr', 'Mar'];
$app_12_array = array_fill_keys( $last_12_months, 0 );
foreach ( $last_12_months as $m => $month )
{
foreach ( $app_12_array_temp AS $app )
{
if ( date( "m", strtotime( $app['time'] ) ) == date( "m", strtotime( $month ) ) )
{
$app_12_array[ $month ] = ($app_12_array[ $month ] ?? 0 ) + $app['count'];
break;
}
}
}
var_dump( $app_12_array );
答案 1 :(得分:0)
这是使用do-while loop
解决问题的一种方法。通过修改$dateFirst
变量,可以轻松地将其用于较短/更长的期限,然后为12个月。
代码:
$data = [
['time' => '2019-07-27 13:00:00', 'count' => '1'],
['time' => '2019-08-26 13:00:00', 'count' => '2'],
['time' => '2019-09-06 13:00:00', 'count' => '8'],
['time' => '2019-10-22 12:00:00', 'count' => '9'],
['time' => '2019-11-21 12:00:00', 'count' => '15'],
['time' => '2019-12-27 11:00:00', 'count' => '2'],
['time' => '2020-01-22 15:00:00', 'count' => '4'],
['time' => '2020-02-12 09:00:00', 'count' => '1'],
];
usort($data, function($a, $b) {
return strtotime($a['time']) - strtotime($b['time']);
});
if (!is_array($data) || count($data) === 0) {
die('no data');
}
$dateFirst = (date('Y', time()) - 1) . date('-m', time());
// begin 11 months ago instead of 12 [start]
if (date('n', strtotime($dateFirst)) == 12) {
$dateFirst = (date('Y', strtotime($dateFirst)) + 1) . '-01';
} else {
$newMonth = (date('n', strtotime($dateFirst)) + 1);
$dateFirst = date('Y', strtotime($dateFirst)) . '-' . ($newMonth <= 9 ? '0' . $newMonth : $newMonth);
}
// begin 11 months ago instead of 12 [end]
$dateCurrent = $dateFirst;
$tsDateNow = strtotime(date('Y-m', time()));
$result = [];
do {
if (!isset($result[$dateCurrent])) {
$result[$dateCurrent] = 0;
}
for ($i = 0; $i < count($data); $i++) {
$dateCheck = date('Y-m', strtotime($data[$i]['time']));
if ($dateCheck === $dateCurrent) {
$result[$dateCurrent] += $data[$i]['count'];
}
}
if (date('n', strtotime($dateCurrent)) == 12) {
$dateCurrent = (date('Y', strtotime($dateCurrent)) + 1) . '-01';
} else {
$newMonth = (date('n', strtotime($dateCurrent)) + 1);
$dateCurrent = date('Y', strtotime($dateCurrent)) . '-' . ($newMonth <= 9 ? '0' . $newMonth : $newMonth);
}
} while (strtotime($dateCurrent) <= $tsDateNow);
// exclude this month:
// } while (strtotime($dateCurrent) < $tsDateNow);
print_r($result);
输出:
Array
(
[2019-03] => 0
[2019-04] => 0
[2019-05] => 0
[2019-06] => 0
[2019-07] => 1
[2019-08] => 2
[2019-09] => 8
[2019-10] => 9
[2019-11] => 15
[2019-12] => 2
[2020-01] => 4
[2020-02] => 1
)
如果您在一个月内有多个具有不同日期的元素,则此代码还将汇总所有count
。
因此,如果您具有以下数组:
$data = [
['time' => '2019-07-27 13:00:00', 'count' => '1'],
['time' => '2019-08-26 13:00:00', 'count' => '2'],
['time' => '2019-09-06 13:00:00', 'count' => '8'],
['time' => '2019-10-22 12:00:00', 'count' => '9'],
['time' => '2019-07-04 09:00:00', 'count' => '1000'],
['time' => '2019-11-21 12:00:00', 'count' => '15'],
['time' => '2019-12-27 11:00:00', 'count' => '2'],
['time' => '2020-01-22 15:00:00', 'count' => '4'],
['time' => '2020-02-12 09:00:00', 'count' => '1'],
];
这将是输出:
Array
(
[2019-03] => 0
[2019-04] => 0
[2019-05] => 0
[2019-06] => 0
[2019-07] => 1001
[2019-08] => 2
[2019-09] => 8
[2019-10] => 9
[2019-11] => 15
[2019-12] => 2
[2020-01] => 4
[2020-02] => 1
)