【问题标题】:PHP Arrays - Merge two arrays where a value is added togetherPHP Arrays - 合并两个数组,其中一个值相加在一起
【发布时间】:2017-03-03 10:07:51
【问题描述】:

我需要更多关于 PHP 数组和我遇到的问题的帮助。我有一个这样的数组:-

array(2) {
  [0]=>
  array(2) {
    [0]=>
    array(2) {
      ["count"]=>
      string(3) "100"
      ["id"]=>
      int(46)
    }
    [1]=>
    array(2) {
      ["count"]=>
      string(3) "300"
      ["id"]=>
      int(53)
    }
  }
  [1]=>
  array(1) {
    [0]=>
    array(2) {
      ["count"]=>
      string(3) "200"
      ["id"]=>
      int(46)
    }
  }
}

但是,我希望它看起来更像这样的数组:-

array(2) {
    [0]=>
    array(2) {
      ["count"]=>
      string(3) "300" <--- This has been added from Array 1 and 2
      ["id"]=>
      int(46)
    }
    [1]=>
    array(2) {
      ["count"]=>
      string(3) "300"
      ["id"]=>
      int(53)
    }
  }

基本上,如果两个区域中的 id 相同,我希望将计数相互添加,但如果不是,则只需将其单独放置并包含在数组中。

我已经使用了许多数组函数,例如 array_merge 和 array_push,但我对它是如何工作的想法已经不多了。我也开始使用 if 语句进行 foreach 工作,但我只是让自己完全糊涂了。我只需要第二双眼睛来看看这个问题,看看它是如何解决的。

再次感谢大家。

【问题讨论】:

  • 这种数组有用吗? array(array(["count"]=&gt;300,["id"]=46),array(["count"]=&gt;300,["id"]=53))。这可以通过自定义函数来实现。
  • 嗨,moni_dragu,我不确定你想说什么?这就是我试图从两个数组中实现的目标。
  • 实际上我试图提出一种不同的数组类型,但分心了。这是我指的类型:array('id'=&gt;'count'),在您的示例中是指array('46'=&gt;'300','53'=&gt;'300')
  • 实际上这可能是可以使用的,但我仍在尝试找到一种方法将它们合并在一起并添加值。
  • 然而,这被两个查询转储出来,一个用于活动表,一个用于存档表。

标签: php arrays


【解决方案1】:

你可以这样使用:

$end_array = array();

function build_end_array($item, $key){

    global $end_array;

    if (is_array($item)){

        if( isset($item["id"])){

            if(isset($end_array[$item["id"]]))
                $end_array[$item["id"]] = $end_array[$item["id"]] + $item["count"]*1;
            else 
                $end_array[$item["id"]] = $item["count"]*1;
        }
        else {
            array_walk($item, 'build_end_array');
        }
    }
}

array_walk($start_array, 'build_end_array');

Here is a fiddle.

【讨论】:

    【解决方案2】:

    非常感谢大家。我实际上是这样做的:-

    $fullArray = array_merge($live, $archive);
    
    $array = array();
    foreach($fullArray as $key=>$value) {
        $id = $value['id'];
        $array[$id][] = $value['count'];
    }
    
    $result = array();
    foreach($array as $key=>$value) {
        $result[] = array('id' => $key, 'count' => array_sum($value));
    }
    
    return $result;
    

    【讨论】:

      【解决方案3】:

      应该使用这样的东西:

      $idToCountArray = array(); //temporary array to store id => countSum
      array_walk_recursive($inputArray, function($value,$key) { //walk each array in data structure
          if(isset(value['id']) && isset($value['count'])) {
              //we have found an entry with id and count:
              if(!isset($idToCountArray[$value['id']])) {
                  //first count for id => create initial count
                  $idToCountArray[$value['id']] = intval($value['count']);
              } else {
                  //n'th count for id => add count to sum
                  $idToCountArray[$value['id']] += intval($value['count']);
              }
          }
      });
      //build final structure:
      $result = array();
      foreach($idToCountArray as $id => $countSum) {
          $result[] = array('id' => $id, 'count' => ''.$countSum);
      }
      

      请注意,我没有测试代码,可能有更优雅/性能更好的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多