【问题标题】:PHP subtract the elements of an array within the elementsPHP在元素中减去数组的元素
【发布时间】:2018-08-08 17:39:30
【问题描述】:

我有一个数组[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 {

            }
        }

【问题讨论】:

  • 计算数组的大小。使用 for 循环,在其中使用每次循环减去的迭代器,然后您可以以这种方式指向数组中的最后一个键
  • 你能给我看一个工作的例子吗?查看我的编辑,这是我尝试过的,但似乎不起作用
  • 在您的问题中使用示例数组会产生什么输出? “余数”是什么意思?
  • 在给定的数组中,输出为 0,例如 7-6 = 1, 5-1 = 4, 5-4 = 1, 4-1 =3, 3-3 = 0

标签: php arrays subtraction


【解决方案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

【讨论】:

    【解决方案2】:

    你希望这样吗?

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

    【讨论】:

      【解决方案3】:

      我的第一个答案是错误的,我看到您需要在第一次减法后丢弃 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,就像在您的示例中一样。当然,这段代码在迭代时仍然需要检查数组的键是否存在

      【讨论】:

      • 不要先对数组进行排序然后反转它。它会减慢你的代码。你计算 $reverse 数组两次为什么不计算一次并将它存储在一个变量中?你不需要变量 $first ,直接使用 $result 。你也应该把你的 for 循环放在 if ...
      • 本例中数组未排序。我知道这会减慢代码。不过,关于计数的好点。该示例仅用于演示。
      【解决方案4】:
      $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;
      

      【讨论】:

      • 每次使用 array_shift 时,都会重新索引数组。这会减慢代码执行时间。当您先对数组进行排序然后反转它时,也会减慢代码执行时间。请改用 rsort。
      【解决方案5】:

      要获得您正在寻找的预期输出,您可以使用rsort 进行降序排序并从最高数字开始。减去前 2 个元素以获得起始值。循环遍历其余部分以获得结果。

      以下是实现这一目标的方法:

      $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
      

      【讨论】:

      • 您说 array_slice 但在代码中使用了数组拼接...您可以简单地使用 for 循环,因为数组拼接或 array_slice 会减慢您的代码执行时间...
      • @Elementary 不错。我正在链接并抓住错误的太快了。我在之前的编辑中确实尝试了 for 循环方式。我习惯使用 foreach 并且不必担心计数。但是,您关于 array_splice 执行时间的观点确实提供了一些见解。似乎 unset 比 array_splice 快得多,我可以保留我的 foreach 所以我会更新答案以反映这一点。如果 OP 关心重新索引,我会声明他可以在那时执行 array_values。
      猜你喜欢
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 2017-08-06
      • 2018-08-11
      相关资源
      最近更新 更多