我有一个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个值后的元素总和?
答案 0 :(得分:2)
// 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中引入的。
// 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中引入了匿名函数
// 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
可能不为零的情况。