我有一个数组[4,3,5,5,7,6]
,我想遍历排序后的数组,并从前一个值中减去最大值,然后从其后的值中减去余数,依此类推,最后,我循环完成时需要一个最终值。
例如
上面的数组将被排序为
Array
(
[0] => 3
[1] => 4
[2] => 5
[3] => 5
[4] => 6
[5] => 7
)
现在,我想找出arr[5] and arr[4]
之间的差,结果将为1,然后从arr[3]
中减去结果,依此类推,直到循环完成
这是我尝试过的方法,但似乎不起作用
for ($i = count($a)-1; $i >0; $i--){
echo $result = $a[$i] - $a[$i-1];
echo "<br />";
if($result > 0) {
if($result > $a[$i-2]) {
echo $result = $result - $a[$i-2];
} else {
}
}
答案 0 :(得分:1)
我认为有一种更简单,更快速的方法可以实现:
$array = [4, 3, 5, 5, 7, 6];
rsort($array);
$result = $array[0] - $array[1];
for($i = 2, $count = count($array); $i < $count; $i++){
$result = $array[$i] - $result;
}
print($result);
输出:
0
答案 1 :(得分:0)
您希望这样吗?
$a = [1,1,1,3,1,7];
$result = null;
for ($i = count($a)-1; $i >0; $i--){
if($result == null)
$result = $a[$i-1];
echo $result = $a[$i] - $result;
echo "<br />";
if($result == 0) break;
}
答案 2 :(得分:0)
我的第一个答案是错误的,我看到您需要在第一个减法后丢弃2个键。
这可以完成工作:
<?php
$array = [3,4,5,5,6,7];
$reverse = array_reverse($array);
if (count($reverse) > 1) {
$first = $reverse[0] - $reverse[1];
} else {
//code should stop
}
$result = $first;
for ($i = 2; $i < count($reverse); $i++) {
$result = $reverse[$i] - $result;
}
echo $result;
输出0,就像您的示例一样。当然,此代码仍然需要检查以查看数组的键在迭代时是否确实存在
答案 3 :(得分:0)
要获得所需的期望输出,可以使用rsort
对降序进行排序,并从最高编号开始。将前两个元素相减以获得初始值。循环遍历其余部分以获得结果。
这是您可以实现的方式:
$a = [4, 3, 5, 5, 7, 6]; // Your unsorted array
rsort($a); // Sort array by descending of largest to smallest
$result = $a[0] - $a[1]; // Initial subtraction of first two values
unset($a[0], $a[1]); // Remove from array so it won't loop through
foreach ($a as $_a) { // Loop through remainder and subtract difference
$result = $_a - $result;
}
echo $result; // Show your result
收益:
0
如果您担心由于unset
而导致的重新索引编制,您可以在此之后再添加一行:
$a = array_values($a); // Reindexes array starting at 0 if you desire
答案 4 :(得分:0)
$numbers = [4,3,5,5,7,6];
sort($numbers);
$numbers = array_reverse($numbers);
$first = array_shift($numbers);
$second = array_shift($numbers);
$result = array_reduce($numbers, function ($carry, $current_item) {
return $current_item - $carry;
}, ($first - $second));
echo $result;