php - php - 将当前月份值与数组中前一个过去5个月的值相加

  显示原文与译文双语对照的内容

我有一个 array,有一些值。 在这里,我只需要对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);



从这个数组中,我需要计算前五个月的总和

这意味着我需要最终的array 结果,如下所示:


"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--;


 }


 }



时间:

这个代码可以做你想要的。 它使用嵌套循环循环访问每个月和前面的5个月,从 array 中的不同日期值创建一个总和:


$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 


)



在3v4l.org查看演示

你无需嵌套循环,你可以使用一个循环,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);



https://3v4l.org/LSQRg

我执行了两个步骤。

步骤 1: 按键排序自定义格式 array


//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 上面 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 进行排序
返回的所有键或者键子集的array_keys
如果成功,array_search —搜索给定值并返回第一个对应的键
array_slice —提取 array的一部分
array_sum —计算 array-中的值之和
str_replace —用替换字符串替换搜索字符串的所有匹配项

使用:https://3v4l.org/7AYfT


 $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)


}



...