我有一些值的数组。在这里,我只需要计算2019年。
$array = array(
"date_2019_12" => 0,
"date_2019_11" => 0,
"date_2019_10" => 0,
"date_2019_09" => 0,
"date_2019_08" => 0,
"date_2019_07" => 0,
"date_2019_06" => 0,
"date_2019_05" => 0,
"date_2019_04" => 0,
"date_2019_03" => 0,
"date_2019_02" => 0,
"date_2019_01" => 10,
"date_2018_12" => 1,
"date_2018_11" => 2,
"date_2018_10" => 3,
"date_2018_09" => 4,
"date_2018_08" => 5,
"date_2018_07" => 6,
);
krsort($array);
从此数组中,我需要计算从“ date_2019_01”开始的前五个月和当前月份的总和。
这意味着我需要如下所示的最终数组结果:
"date_2019_01" => 25(10+1+2+3+4+5)
"date_2019_02" => 20(0+10+1+2+3+4)
"date_2019_03" => 16(0+0+10+1+2+3)
"date_2019_04" => 13(0+0+0+10+1+2)
... until "date_2019-12".
我已经花费很多时间寻找解决方案,但是我没有。有人可以帮我吗?
我尝试了以下代码,但现在迷路了。
$newArr = array();
foreach($array as $key => $val) {
$explode = explode("_", $key);
$value = (int)$explode[2];
for($i = 0; $i <= 5; $i++) {
$newArr[$array[$explode[0].'_'.$explode[1].'_'.$value]] = $array[$explode[0].'_'.$explode[1].'_'.$value];
$value--;
}
}
答案 0 :(得分:4)
您不需要嵌套循环,可以使用一个循环,即array_slice和array_sum。
krsort($array);
$year = "2019";
$keys = array_keys($array); //save keys since we use array_values in the loop
foreach(array_values($array) as $k => $v){
// If the year is found in the key slice out the next six item and sum them
if(strpos($keys[$k], $year) !== false) $res[$keys[$k]] = array_sum(array_slice($array, $k, 6));
}
var_dump($res);
答案 1 :(得分:3)
此代码将执行您想要的操作。它使用嵌套循环遍历每个月和前五个月,并根据数组中不同的日期值为每个月创建一个总和:
$year = 2019;
$sums = array();
for ($i = 1; $i <= 12; $i++) {
$sum = 0;
for ($j = $i - 5; $j <= $i; $j++) {
$y = $year;
$m = $j;
if ($m <= 0) {
$m += 12;
$y -= 1;
}
$date = sprintf("date_%4d_%02d", $y, $m);
$sum += $array[$date];
}
$date = sprintf("date_%4d_%02d", $year, $i);
$sums[$date] = $sum;
}
print_r($sums);
输出:
Array (
[date_2019_01] => 25
[date_2019_02] => 20
[date_2019_03] => 16
[date_2019_04] => 13
[date_2019_05] => 11
[date_2019_06] => 10
[date_2019_07] => 0
[date_2019_08] => 0
[date_2019_09] => 0
[date_2019_10] => 0
[date_2019_11] => 0
[date_2019_12] => 0
)
答案 2 :(得分:3)
我执行了两个步骤。
步骤1 :按键对自定义格式数组进行排序
// sort the array first by date of given format
uksort($array, function ($a, $b) {
$t1 = strtotime(str_replace(["date_", "_"], ["", "-"], $a) . '-01');
$t2 = strtotime(str_replace(["date_", "_"], ["", "-"], $b) . '-01');
return $t1 - $t2;
});
第2步:使用内联文档对给定条件的主要逻辑
$flag = false;
$result = [];
foreach ($array as $key => $value) {
if ($key != 'date_2019_01' && !$flag) {
continue; // check until 'date_2019_01' wont come
} else {
$flag = true; // set the flag and skip above condition
$curKey = array_search($key, array_keys($array), true); // get integer index of date_2019_01
if ($key !== false) { // if key exists
$slice = array_slice($array, $curKey - 5, 6, true); // from current index last 5(6-5, 7-5,8-5,....) to 6(including current element)
$result[$key] = array_sum($slice); // sum of there values
}
}
}
为了简化对应用程序的理解,我曾经简单介绍过这些内容。
uksort —使用用户定义的比较功能按键对数组进行排序
array_keys —返回数组的所有键或键的子集
array_search —在数组中搜索给定值,如果成功,则返回第一个对应的键
array_slice —提取数组的一部分
array_sum —计算数组中的值之和
str_replace-用替换字符串替换所有出现的搜索字符串
答案 3 :(得分:2)
$newArr = array();
foreach($array as $key => $val) {
$i=1;
$newArr[$key] = $val;
foreach($array as $key2 => $val2){
if($key>$key2 && $i <= 5){
$newArr[$key] += $val2;
$i++;
}
}
}
array(18) {
["date_2019_12"]=>
int(0)
["date_2019_11"]=>
int(0)
["date_2019_10"]=>
int(0)
["date_2019_09"]=>
int(0)
["date_2019_08"]=>
int(0)
["date_2019_07"]=>
int(0)
["date_2019_06"]=>
int(10)
["date_2019_05"]=>
int(11)
["date_2019_04"]=>
int(13)
["date_2019_03"]=>
int(16)
["date_2019_02"]=>
int(20)
["date_2019_01"]=>
int(25)
["date_2018_12"]=>
int(21)
["date_2018_11"]=>
int(20)
["date_2018_10"]=>
int(18)
["date_2018_09"]=>
int(15)
["date_2018_08"]=>
int(11)
["date_2018_07"]=>
int(6)
}