【问题标题】:Sum and deduct according to array list in PHP using array map使用数组映射根据PHP中的数组列表求和和减去
【发布时间】:2021-07-06 06:36:39
【问题描述】:

我有两个数组

$a = [500,0,300,0];
$b = [0, 100, 0, 100];

我的愿望输出:

$c = [500,400,700,600];

我尝试了以下方法,但没有得到期望的输出。

<?php 

function get_c()
{
    $amount = 0;
    
    if (func_get_arg(0) > 0) {
        $amount = $amount + func_get_arg(0);
    } else {
        $amount = $amount - func_get_arg(1);
    }
    return $amount;

}
$a = [500,0,300,0];
$b = [0, 100, 0, 100];


$c = array_map(
    'get_c',
    $a,
    $b
);

print_r($c);

得到输出 [500,-100,300,-100] 。我知道在 if 条件下我的金额值总是为零。我该如何解决这个问题?

【问题讨论】:

  • 您能否解释一下为什么$c[1]4000 + 100 应该是100
  • 哦,我想我现在明白了。您想将两个数组中的所有先前条目相加。
  • @David 是的,你是对的。这就像交易声明。
  • @0stone0 就像 transactions ,而不是对两个数组求和。
  • map 不是这样运作的。阅读array_map 上的文档以了解 PHP 的实现。还可以查看相关操作:filter、fold/reduce 和 zip/convolution。

标签: php


【解决方案1】:

当您使用 array_map 函数时,它会为每个元素调用 get_c 并每次初始化 $amount =0。 要解决这个问题,你可以使用一个简单的 foreach 循环。

<?php 

function get_c($a, $b) :array
{
     $amount = 0;
     $output = array();
    
    foreach($a as $key =>$value) 
    {
        if($value >0) {
             $amount = $amount + $value;
        }
        else $amount = $amount - $b[$key];
        
        $output[] = $amount;
    }
    return $output;
}

$a = [500,0,300,0];
$b = [0, 100, 0, 100];


$c = get_c($a,$b);
print_r($c);

希望能回答你的问题

【讨论】:

    【解决方案2】:

    如果两个数组的索引相同,我们可以使用一个简单的 for 循环。

    使用(在第一次迭代后 (??))$c 中的最后一个值来获取新值:

    <?php
    
    $a = [500,0,300,0];
    $b = [0, 100, 0, 100];
    $c = [];
    
    for ($i=0; $i < sizeof($a); $i++) {
        $c[$i] = ($c[$i - 1] ?? 0) + $a[$i] - $b[$i];
    }
    
    var_dump($c);
    
    array(4) {
      [0]=>
      int(500)
      [1]=>
      int(400)
      [2]=>
      int(700)
      [3]=>
      int(600)
    }
    

    Try it online!

    【讨论】:

    • 两个数组的索引不同,这就是我使用数组映射的原因。
    • 您的问题显示了 2 个具有相同数量索引的数组
    • 对不起!这只是一个例子。
    【解决方案3】:

    您可以在地图之后使用简单的 foreach 循环来修复它。这个循环只是按顺序对整个结果数组求和。

    foreach($c as $i => $val)
    {
        if($i == 0)
            continue;
            
        $c[$i] = $c[$i-1] + $val;
    }
    

    完整代码:

    function get_c()
    {
        $amount = 0;
        
        if (func_get_arg(0) > 0) {
            $amount = $amount + func_get_arg(0);
        } else {
            $amount = $amount - func_get_arg(1);
        }
        return $amount;
    
    }
    
    $a = [500,0,300,0];
    $b = [0, 100, 0, 100];
    
    
    $c = array_map(
        'get_c',
        $a,
        $b
    );
    
    foreach($c as $i => $val)
    {
        if($i == 0)
            continue;
            
        $c[$i] = $c[$i-1] + $val;
    }
    
    print_r($c);
    

    结果:

    Array
    (
        [0] => 500
        [1] => 400
        [2] => 700
        [3] => 600
    )
    

    【讨论】:

      猜你喜欢
      • 2016-11-05
      • 2021-12-07
      • 2016-04-16
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      相关资源
      最近更新 更多