【问题标题】:php, sum two array valuesphp,对两个数组值求和
【发布时间】:2019-07-08 10:01:17
【问题描述】:

我有两个数组

第一个数组:

Array ( 
    [01-1970] => 0.00 
    [03-2019] => 4350.00 
    [05-2019] => 150.00 
    [06-2019] => 50.00 
)

第二个数组:

Array ( 
    [03-2019] => 0.00
    [04-2019] => 0.00 
    [06-2019] => 34.83 
)

我的预期总和结果是:

Array ( 
    [01-1970] => 0.00 
    [03-2019] => 4350 
    [04-2019] => 0.00  
    [05-2019] => 150.00 
    [06-2019] => 84.83
)

如何做到这一点?

【问题讨论】:

  • @MayankVadiya 数组有不同的键。 ..
  • @treyBake 他想对相同的键求和,检查预期输出
  • @MayankVadiya true- 但要合并的数组不是同一个键

标签: php arrays multidimensional-array


【解决方案1】:

您可以使用array_keys 从两个数组中获取唯一性,然后循环遍历其中一些键

$r = [];
$keys = array_keys($a1+$a2);
foreach($keys as $v){
  $r[$v] = (empty($a1[$v]) ? 0 : $a1[$v]) + (empty($a2[$v]) ? 0 : $a2[$v]);
}

Working DEMO

【讨论】:

    【解决方案2】:

    最好的办法是单独循环数组,然后将这些值汇总到一个结果数组中。我们可以创建一个包含两个数组的新数组,以稍微缩短我们的代码(请参阅我们如何将[$first, $second] 定义为第一个循环)。

    这消除了混合长度的任何问题,并保持数组中的所有键和值不变。

    $result = [];
    // Loop over our two arrays, here called $first and $second
    foreach ([$first, $second] as $a) {
        // Loop over the values in each array
        foreach ($a as $k=>$v) {
            // If the index is new to the $result array, define it to be zero (to avoid undefined index notices) 
            if (!isset($result[$k]))
                $result[$k] = 0;
    
            // Sum up the value!
            $result[$k] += $v;
        }
    }
    print_r($result);
    

    【讨论】:

      【解决方案3】:

      你可以使用我做的一个函数:

      <?php
          function array_sum_multi($arrayOne, $arrayTwo)
          {
              # get rid of keys
              $valuesOne = array_values($arrayOne);
              $valuesTwo = array_values($arrayTwo);
      
              //create return array
              $output = [];
      
              # loop that shizzle
              for ($i = 0; $i < count($valuesOne); $i++)
              {
                  $output[$i] = $valuesOne[$i] + (!empty($valuesTwo[$i]) ? $valuesTwo[$i] : 0);
              }
      
              return $output;
          }
      
          $result = array_sum_multi([0.00, 4350.00, 150.00, 50.00], [0.00, 0.00, 34.83]);
      
          # then for your keys:
          $result = array_combine(array_keys($yourFirstArray), $result);
      
          echo '<pre>'. print_r($result, 1) .'</pre>';
      

      【讨论】:

        【解决方案4】:
        $result = $first_array; // just copy array into result
        
        // scan second array
        foreach ($second_array as $k => $v) {
           // if key already exists, then add, else just set
           $result[$k] = isset($result[$k]) ? ($result[$k] + $v) : $v;
        }
        
        // done
        print_r($result);
        

        【讨论】:

        • 您可能想打印$result,而不是$second_array? :-) 在所有“固定两个数组”的答案中,这是最优雅的方式,imo(我的答案有点动态,可以处理超过 2 个数组,所以这就是区别)。 +1
        • @Qirel 是的,你是对的。那应该是$result。感谢您指出。我编辑了答案。这个也可以处理超过 2 个数组。所有需要的是为每个下一个数组重复foreach 部分。结果将是所有这些的总和
        【解决方案5】:

        实现它的一种简单方法是遍历每个数组,并将其添加到具有相同键的公共数组中。

        如果第一个数组小于第二个数组或第二个数组中的某些元素不存在于第一个数组中,则仅循环一个数组会导致缺少一些元素。

        所以让我们循环遍历它们并将其添加到 sum 中。

        $sum = [];
        
        foreach($firstArray as $key => $value){
          $sum[$key] = $value + (isset($sum[$key]) ? $sum[$key] : 0.0);
        }
        foreach($secondArray as $key => $value){
          $sum[$key] = $value + (isset($sum[$key]) ? $sum[$key] : 0.0);
        }
        
        print_r($sum);
        

        【讨论】:

          【解决方案6】:

          试试这个简单的方法谢谢,

          $sum = [];
          foreach($firstArray as $key => $value){
              if(array_key_exists($key,$secondArray)){
                  $newArray = [$key=>$value+$secondArray[$key]]; 
                  $sum = array_merge($sum,$newArray);
              }else{
                  $newArray = [$key=>$value]; 
                  $sum = array_merge($sum,$newArray);
              }
          }
          
          //your final required result
          var_dump($sum);
          

          【讨论】:

            【解决方案7】:

            试试这个,

            $a1 = array (
                    '01-1970' => 0.00,
                    '03-2019' => 4350.00,
                    '05-2019' => 150.00,
                    '06-2019' => 50.00
                );
            
            $a2 = array (
                    '03-2019' => 0.00,
                    '04-2019' => 0.00,
                    '06-2019' => 34.83
                );
            
            $sums = array();
            foreach (array_keys($a1 + $a2) as $key) {
                $sums[$key] = @($a1[$key] + $a2[$key]);
            }
            
            echo "<pre>";
            print_r($sums);
            

            Here 是您可以使用的其他解决方案。

            加油!

            【讨论】:

              【解决方案8】:
              $sumArray = [];
              
              foreach($firstArray as $key => $value) {
                  $sumArray[$key] = $value + ($secondArray[$key] ?? 0);
              }
              

              【讨论】:

              • 答案应该有解释,以便 OP 和未来的访问者可以学习
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多