php 从数组中删除第一个元素,并从数组中的所有后续值中实现条件减法

xn1cxnb4  于 2023-10-15  发布在  PHP
关注(0)|答案(3)|浏览(91)

我试图设计一个函数来执行减法,同时迭代数组中的数字。第一个数字需要被删除,并用于与其余数字相减。在执行减法时,任何值都不应减少为负数。此外,如果遇到大于被保留的值的新值,则保留的值将增加到更大值的量。
当前代码:

function pairwiseDifference($array) 
{
    $n = count($array) - 1;  // you can add the -1 here
    $diff = 0;
    $result = array();

    for ($i = 0; $i < $n; $i++) { 
        // absolute difference between 
        // consecutive numbers 
        $diff = abs($array[$i] - $arry[$i + 1]); 
        echo $diff." ";
        array_push($result, $diff);   // use array_push() to add new items to an array
    }

    return $result;  // return the result array
}

$array = [20,10,10,50];

// Percent of commisions are: 
pairwiseDifference($array);

我的代码错误地打印了10,0,40,我需要以下值作为输出:0,0,30
一些额外的输入和期望的输出:

$input = [20, 10, 10, 50, 100, 25];
$output = [    0,  0, 30,  50,  0];
$input = [80, 20, 30, 10, 50];
$output = [    0,  0,  0,  0];
$input = [10, 40, 10, 50, 40];
$output = [   30,  0, 10,  0];
xbp102n0

xbp102n01#

为了简化将第一个值移出输入数组的步骤,在将数组传递到自定义函数时将其解包。
在函数签名中,将第一个值隔离为变量,然后将所有剩余的值收集为数组。
循环遍历缩短的数组,如果当前值大于要减去的量,则将当前值设置为两者之差,并将要减去的量更新为原始值。否则,将当前值减为零。
代码:(Demo

function reduceCommissions(int $subtractBy, int ...$commissions): array
{
    return array_map(
        function($v) use (&$subtractBy) {
            if ($v > $subtractBy) {
                $difference = $v - $subtractBy;
                $subtractBy = $v;
            }
            return $difference ?? 0;
        },
        $commissions
    );
}

foreach ($tests as $test) {
    var_export(reduceCommissions(...$test));
}

测试和输出:

$tests = [
    [20,10,10,50],        // [0, 0, 30]
    [20,10,10,50,100,25], // [0, 0, 30, 50, 0]
    [10,40,10,50,40]      // [30, 0, 10, 0];
];
iovurdzv

iovurdzv2#

由于数组的第一个元素是你的佣金,其他元素是父母的佣金,而且你似乎不想在结果数组中包含你的佣金,你可以这样做:

function pairwiseDifference($arry) 
{
    $n = count($arry);
    $diff = 0;
    $result = array();

    $myComm = $arry[0];  // your commision

    for ($i = 1; $i < $n; $i++) 
    {
        $diff = 0;                     // set $diff to 0 as default
        if($myComm < $arry[$i])          // if your commision < parent commision
            $diff = $arry[$i] - $myComm;
        echo $diff." ";
        array_push($result, $diff);
    }

    return $result;
}

$arry = array(20,10,10,50);
echo "<br> Percent of commisions are: ";

$diffArray = pairwiseDifference($arry);

echo $diffArray[0];  // prints 0
echo $diffArray[1];  // prints 0
echo $diffArray[2];  // prinst 30
mwngjboj

mwngjboj3#

要根据您的代码调整逻辑,只需进行3次修改。

  • 创建一个$max变量,并将$arry[0]的值赋给它。
  • 如果当前最大值大于当前最大值,则将差值设为0,否则取差值。
  • 使用max()函数再次计算新的max。
    片段:
<?php

function pairwiseDifference($arry) 
{
    $n = count($arry) - 1;  // you can add the -1 here
    $diff = 0;
    $result = array();
    $max = $arry[0]; // new addition
    for ($i = 1; $i <= $n; $i++)  // new modification <= n instead of < n
   { 
       // absolute difference between 
       // consecutive numbers 
       $diff = $max < $arry[$i] ? $arry[$i] - $max : 0; // new modification
       $max = max($max, $arry[$i]); // new modification
       echo $diff." ";
       array_push($result, $diff);   // use array_push() to add new items to an array
   }

   return $result;  // return the result array
}

$arry = array(20,10,10,50);
echo "<br> Percent of commisions are: ";

// this echos 10,0,40 and assigns whatever your function returns 
// to the variable $diffArray
$diffArray = pairwiseDifference($arry);

相关问题