PHP数组 - 合并两个数组,其中一起添加一个值

时间:2016-10-21 07:32:04

标签: php arrays

我需要一些关于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,但我让自己完全糊涂了。我只需要第二双眼睛来看问题,看看它是如何完成的。

再次感谢大家。

3 个答案:

答案 0 :(得分:1)

应该使用类似的东西:

$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);
}

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

答案 1 :(得分: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 :(得分:0)

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

$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;