数组中的当前月份值与上一个最近5个月的值之和

时间:2019-04-19 07:10:58

标签: php arrays

我有一些值的数组。在这里,我只需要计算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--;
            }
        }

4 个答案:

答案 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);

What are the things are checked at compile time by Java?

答案 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 
)

Demo on 3v4l.org

答案 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)

使用: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)
}