PHP数组未知值的数量

时间:2018-03-22 10:18:26

标签: php arrays

我有一个PHP数组,其数值未知,从技术上讲它可以永远持续下去。但我希望在7个值之后得到一个值的总和。示例:sum:$ array [0],$ array [7]等等。从0和7日,14日等开始。

这个问题对我来说一直很头疼,我是一个初学php程序员。

$day1 = $array[0] + $array[7];
$day2 = $array[1] + $array[8];
$day3 = $array[2] + $array[9];
$day4 = $array[3] + $array[10];
$day5 = $array[4] + $array[11];
$day6 = $array[5] + $array[12];
$day7 = $array[6] + $array[13];

但是如果我有更多的值

那该怎么办?
$day1 = $array[0] + $array[7] + $array[13];
$day2 = $array[1] + $array[8] + $array[15];
$day3 = $array[2] + $array[9] + $array[16];
...

此时不再是完成任务的问题,而是一个逻辑任务。

如何获得每7个值后的元素总和?

3 个答案:

答案 0 :(得分:2)

PHP 5.6+解决方案:

// Split the array into chunks of 7 items; the last chunk could be smaller
$chunks = array_chunk($array, 7);

// Iteratively apply a function to corresponding elements of each array
$result = array_map(
  // The mapping function receives 7 arguments, one from each chunk
  function(...$values) {          // Pack the arguments into a single array
    return array_sum($values);    // Return the sum of arguments
  },
  // Unpack $chunks into individual arguments (7 arrays)
  ...$chunks
);

使用其他语言称为“ splat 运算符”(...)的其他语言,详细了解arguments packing and unpacking。它是在PHP 5.6中引入的。

PHP 5.3+解决方案

// Split the array into chunks of 7 items; the last chunk could be smaller
$chunks = array_chunk($array, 7);

// Prepare the arguments list for array_map() into $chunks
// Put the mapping function in front of the arrays
array_unshift($chunks, function() {
      // Return the sum of function arguments
      return array_sum(func_get_args());
});
// Call array_map() with the arguments stored in $chunks
$result = call_user_func_array('array_map', $chunks);

详细了解func_get_args()call_user_func_array()anonymous functions。 PHP 5.3中引入了匿名函数

适用于任何PHP版本的解决方案

// Initialize the 7 sums with 0
$result = array_fill(0, 7, 0);
// Iterate over the array, add each item to the correct sum
foreach ($array as $key => $value) {
    // $key % 7 distributes each value to the next index
    // starting over on each multiple of 7
    $result[$key % 7] += $value;
}

最后一句话

使用第一个或第二个解决方案给您的朋友或招聘人员留下深刻印象。使用生产代码中的最后一个解决方案它更清晰,对于小型输入阵列(少于100个项目),它比其他两个更快。对于更大的阵列,5.6+解决方案更快,特别是在PHP 7上。

答案 1 :(得分:1)

这种方式不是很优雅,但我认为逻辑就在这里:

<?php

$array = [1, 2, 3, 4, 5, 6 , 7, 8, 9, 1, 2,3,4,5,6,7];
$day1=$day2=$day3=$day4=$day5=$day6=$day7=0;

foreach ($array as $key => $value)
{
    switch ($key % 7){
        case 0: $day1 = $day1 + $value; break;
        case 1: $day2 = $day2 + $value; break;
        case 2: $day3 = $day3 + $value; break;
        case 3: $day4 = $day4 + $value; break;
        case 4: $day5 = $day5 + $value; break;
        case 5: $day6 = $day6 + $value; break;
        case 6: $day7 = $day7 + $value; break;
    }
}

答案 2 :(得分:0)

如果您希望得到以下七个值的总和:

//break the array into an array of arrays with 7 items each
$chunks = array_chunk($array, 7);

//map the items
$sums = array_map(function ($chunk) {
  //reduce the sum
  return array_reduce($chunk, 
    function ($sum, $val){ 
      return $sum + $val; 
    }, 0);
}, $chunks);

更新由于@axiac的评论,以上内容可以替换为:

$sums = array_map(function ($chunk) { 
  return array_sum($chunk);
}, $chunks);

请注意,这不包括案件中的最后一项可能少于七项。

如果你想得到第一和第七,第二,第八,第三和第九等的总和:

$sums = [];

for ($i = 0; $i < 7; $i++) {
  $sum = 0;
  for ($n = $i; $n < count($array); $n += 7) {
    $sum += $array[$n];
  }
  $sums[] = $sum;
}

请注意,这也不涉及count($array) % 7可能不为零的情况。