PHP数组值的数量未知

PHP数组值的数量未知,php,arrays,Php,Arrays,我有一个值未知的PHP数组,从技术上讲,它可以永远持续下去。但是我想要一个7个值之后的值的总和。例如:$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

我有一个值未知的PHP数组,从技术上讲,它可以永远持续下去。但是我想要一个7个值之后的值的总和。例如:$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个值后元素的总和?

这种方法不是很优雅,但我认为逻辑如下:

<?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;
    }
}

如果要获得以下七个值的总和:

//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;
}
$sums=[];
对于($i=0;$i<7;$i++){
$sum=0;
对于($n=$i;$n
请注意,这也不处理
count($array)%7
可能不为零的情况

PHP 5.6+解决方案: 阅读有关使用其他语言称为“splat运算符”(
)的更多信息。它是在PHP5.6中引入的

PHP5.3+解决方案 阅读更多关于,以及。PHP5.3中引入了匿名函数

适用于任何PHP版本的解决方案 最后一句话
使用第一种或第二种解决方案给你的朋友或招聘人员留下深刻印象。使用生产代码中的最后一个解决方案;它更清晰,对于小的输入数组(少于100项),它比其他两个更快。对于较大的数组,5.6+解决方案更快,尤其是在PHP7上。

无法解析问题。显然,您应该从学习如何计数开始
$array[6]
在第一个示例中使用了两次,而
$array[13]
在第二个示例中使用了两次。在这之后,您可以简单地使用一个loop.loop并使用
array\u reduce($chunk,function($sum,$val){return$sum+$val;},0)
只是一种复杂的方法来做更快的事情。无论如何,它并没有产生预期的结果。@axiac还不知道……这就是我今天早上想的,但它确实不是很优雅。嘿,很有趣。我会在代码审查中使用核武器,但这很有趣;)
// 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
);
// 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);
// 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;
}