【问题标题】:Sum values of a Multidimensional Array with repeating var具有重复 var 的多维数组的总和值
【发布时间】:2017-02-04 21:09:26
【问题描述】:

所以我试图合并一个数组的重复值,但也要对这些值求和。

所以 atm 我得到了这个数组:

[969] => Array
    (
        [zip] => 8043
        [total] => 2355.00
        [orders] => 1
    )

[968] => Array
    (
        [zip] => 8225
        [total] => 1195.00
        [orders] => 1
    )

[967] => Array
    (
        [zip] => 8043
        [total] => 1640.00
        [orders] => 1
    )

我希望它们基于“zip”合并并变成这样的东西:

     [969] => Array
    (
        [zip] => 8043
        [total] => 3995.00
        [orders] => 2
    )

[968] => Array
    (
        [zip] => 8225
        [total] => 1195.00
        [orders] => 1
    )

【问题讨论】:

    标签: php arrays sorting multidimensional-array array-merge


    【解决方案1】:

    编辑后的答案,可以使用随机键数组

    最初,我对键为 0...infinity 的数组进行了此操作,但它们必须具有所有键并按顺序排列。这适用于任意数量的数组键和任意顺序。

    <?php
    
    $array[10] = Array(
        'zip' => 8043,
        'total' => 2355.00,
        'orders' => 1
      );
    
    $array[1] = Array(
          'zip' => 8225,
          'total' => 1195.00,
          'orders' => 1
      );
    
    $array[44] = Array(
          'zip' => 8225,
          'total' => 1195.00,
          'orders' => 1
      );
    
    $array[2] = Array(
          'zip' => 8043,
          'total' => 1640.00,
          'orders' => 1
      );
    $array[3] = Array(
          'zip' => 8043,
          'total' => 3434.00,
          'orders' => 1
      );
    
    function mergeSimilarZip($array) {
      sort($array);
      $newArray = array();
      $k = 0;
      for ($i = 0; $i < count($array); $i++) {
          $newArray[$k]['zip'] = $array[$i]['zip'];
          $newArray[$k]['total'] = $array[$i]['total'];
          $newArray[$k]['orders'] = $array[$i]['orders'];
          for ($j = $i + 1; $j < count($array); $j++) {
            if ($array[$i]['zip'] == $array[$j]['zip']) {
              $newArray[$k]['total'] += $array[$j]['total'];
              $newArray[$k]['orders']++;
              unset($array[$j]);
            }
          }
        sort($array);
        $k++;
      }
      return $newArray;
    }
    
    $newArray = mergeSimilarZip($array);
    
    var_dump($newArray);
    

    输出:

    array (size=2)
      0 => 
        array (size=3)
          'zip' => int 8043
          'total' => float 7429
          'orders' => int 3
      1 => 
        array (size=3)
          'zip' => int 8225
          'total' => float 2390
          'orders' => int 2
    

    【讨论】:

    • 这似乎有效,直到我注意到一些邮政编码被遗漏了。我有一个 zip 5625,在我的数组中显示了 2 次,但是当我使用您的代码合并它们时,5626 完全消失了。
    猜你喜欢
    • 1970-01-01
    • 2017-08-27
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多