$arrayall=array(
    array('id'=>1,'count'=>1),
    array('id'=>2,'count'=>2),
    array('id'=>3,'count'=>3),
    array('id'=>4,'count'=>3)
    );
$array1=array(
    array('id'=>1,'count'=>1),
    array('id'=>2,'count'=>2),
    array('id'=>3,'count'=>35),
    array('id'=>5,'count'=>42)
    );
把array1 '加到'$arrayall 上
id一样的 就把count相加 
$arrayall 中有的id而$array1中没有的  这样的直接保留
$arrayall中没有的id而$array1有的  就直接加到$arrayall中
都是二维数组
上述两个数组按照这个规则结果是
echo "<pre>";
print_r($arrayall)
echo "</pre>";
Array(
    [0] => Array(
            [id] => 1
            [count] => 2
        )
    [1] => Array
        (
            [id] => 2
            [count] => 4
        )
    [2] => Array
        (
            [id] => 3
            [count] => 38
        )
    [3] => Array
        (
            [id] => 5
            [count] => 42
        )
    [4] => Array
        (
            [id] => 4
            [count] => 3
        )
)
论坛100金币求一个php函数
http://17zencart.com/forum.php?mod=viewthread&tid=370&fromuid=1

解决方案 »

  1.   


    <?php
    function arrayMerge($a, $b)
    {
    $ac = array();
    $bc = array();
    $ret = array();
    foreach($a as $v)
    {
    $ac[$v['id']] = $v['count'];
    }
    foreach($b as $v)
    {
    $bc[$v['id']] = $v['count'];
    }
    foreach($bc as $k => $v)
    {
    if (isset($ac[$k]))
    {
    $ac[$k] += $v;
    }
    else
    {
    $ac[$k] = $v;
    }
    }
    foreach ($ac as $k => $v)
    {
    $ret[] = array(
    'id' => $k,
    'count' => $v
    );
    }
    return $ret;
    }
    $arrayall=array(
      array('id'=>1,'count'=>1),
      array('id'=>2,'count'=>2),
      array('id'=>3,'count'=>3),
      array('id'=>4,'count'=>3)
    );
    $array1=array(
      array('id'=>1,'count'=>1),
      array('id'=>2,'count'=>2),
      array('id'=>3,'count'=>35),
      array('id'=>5,'count'=>42)
    );
    print_r(arrayMerge($arrayall, $array1));
    ?>对数组做了一下转换,便于合并,这样时间效率是线性的
      

  2.   


    $arrayall=array(
      array('id'=>1,'count'=>1),
      array('id'=>2,'count'=>2),
      array('id'=>9,'count'=>3),
      array('id'=>4,'count'=>3)
      );
    $array1=array(
      array('id'=>1,'count'=>1),
      array('id'=>2,'count'=>2),
      array('id'=>6,'count'=>35),
      array('id'=>5,'count'=>42)
      );$rs = array();
    foreach($array1 as $k=>$v) {
        $rs[$v['id']] = $v;
    }
    array_map('map', $arrayall);var_dump($rs);
    function map($v)
    {
        global $rs;
        $rs[$v['id']]['count'] += intval($v['count']);
    }
    /**
    输出结果:
    array(6) {
      [1]=>
      array(2) {
        ["id"]=>
        int(1)
        ["count"]=>
        int(2)
      }
      [2]=>
      array(2) {
        ["id"]=>
        int(2)
        ["count"]=>
        int(4)
      }
      [6]=>
      array(2) {
        ["id"]=>
        int(6)
        ["count"]=>
        int(35)
      }
      [5]=>
      array(2) {
        ["id"]=>
        int(5)
        ["count"]=>
        int(42)
      }
      [9]=>
      array(1) {
        ["count"]=>
        int(3)
      }
      [4]=>
      array(1) {
        ["count"]=>
        int(3)
      }
    }
    */
      

  3.   

    本帖最后由 xuzuning 于 2012-09-28 18:59:21 编辑
      

  4.   

    谢谢大家的回复,高人还是很多 各位的方法我都试了下 我先把题目复杂一点 
    就是
    $arrayall=array(
      array('id'=>1,'count'=>1,'ddd'=>1),
      array('id'=>2,'count'=>2,'ddd'=>2),
      array('id'=>3,'count'=>3,'ddd'=>9),
      array('id'=>4,'count'=>3,'ddd'=>1)
    );
    $array1=array(
      array('id'=>1,'count'=>1,'ddd'=>1),
      array('id'=>2,'count'=>2,'ddd'=>2),
      array('id'=>3,'count'=>35,'ddd'=>9),
      array('id'=>5,'count'=>42,'ddd'=>2)
    )
    'ddd' 代表还有其他的值 也要在新的数组中出现 'ddd'的值如果id一样 $array1和$arrayall 肯定是一样的
    直接抄下来就好了
    沙发哥 这样就可能实现了
    板凳哥 你这可以实现 我这里不能用全局的 TT
    楼上的哥哥 你运行的结果有点问题
    Array
    (
        [0] => Array
            (
                [id] => 1
                [count] => 2
                [ddd] => 1
            )    [1] => Array
            (
                [id] => 2
                [count] => 4
                [ddd] => 2
            )    [2] => Array
            (
                [id] => 3
                [count] => 38
                [ddd] => 9
            )    [3] => Array
            (
                [id] => 4
                [count] => 3
                [ddd] => 1
            )    [4] => Array
            (
                [count] => 42
            ))
    最后一个题目不符合
    Array
    (
        [0] => Array
            (
                [id] => 1
                [count] => 2
                [ddd] => 1
            )    [1] => Array
            (
                [id] => 2
                [count] => 4
                [ddd] => 2
            )    [2] => Array
            (
                [id] => 3
                [count] => 38
                [ddd] => 9
            )    [3] => Array
            (
                [id] => 4
                [count] => 3
                [ddd] => 1
            )    [4] => Array
            (               [count] => 42
            ))
      

  5.   

    还怪讲究的
    foreach($arrayall as $t) $r[$t['id']] = $t; //按 id 建立索引
    foreach($array1 as $t) {
      if(isset($r[$t['id']])) $r[$t['id']]['count'] += $t['count'];
      else $r[$t['id']] = $t;
    }
    print_r($arrayall = array_values($r));
      

  6.   

    是挺复杂的 有点挑战性 php的函数很多是针对一维数组 对二维的就要自己多次遍历
      

  7.   

    <?php 
    function two_array_add($arrayall,$array1){
    if(!is_array($arrayall) && count($arrayall)<1){
    $arrayall=$array1;
    $new_array=$array1;
    }else{
    foreach ($array1 as $key=>$value){
    if(isinarray($value['id'],'id',$arrayall)){
    foreach($arrayall as $keyy=>$valuee){
    if($valuee['id']===$value['id']){
    $valuee['count']+=$value['count'];
    $new_array[]=$valuee;
    }
    }
    }else{
    $arrayall[]=$value;
    $new_array[]=$value;
    }

    }
    }
    foreach($arrayall as $kkkk=>$vvvv){
    if(!isinarray($vvvv['id'],'id',$new_array)){
    $new_array[]=$vvvv;
    }
    }
    return $new_array;
    }function isinarray($num,$value,$array){
    foreach ($array as  $k=>$v){
    $key = array_search($num, $v); 
    if($value===$key){
    return true;
    }
    }
    return false;
    }
    $arrayall=array(
      array('id'=>1,'count'=>1,'ddd'=>1),
      array('id'=>2,'count'=>2,'ddd'=>2),
      array('id'=>3,'count'=>3,'ddd'=>9),
      array('id'=>4,'count'=>3,'ddd'=>1)
    );
    $array1=array(
      array('id'=>1,'count'=>1,'ddd'=>1),
      array('id'=>2,'count'=>2,'ddd'=>2),
      array('id'=>3,'count'=>35,'ddd'=>9),
      array('id'=>5,'count'=>42,'ddd'=>2)
    );
    $addarray=two_array_add($arrayall,$array1);
    echo "<pre>";
    print_r($addarray);
    echo "</pre>";
    ?>
    运行结果:
    Array
    (
        [0] => Array
            (
                [id] => 1
                [count] => 2
                [ddd] => 1
            )    [1] => Array
            (
                [id] => 2
                [count] => 4
                [ddd] => 2
            )    [2] => Array
            (
                [id] => 3
                [count] => 38
                [ddd] => 9
            )    [3] => Array
            (
                [id] => 5
                [count] => 42
                [ddd] => 2
            )    [4] => Array
            (
                [id] => 4
                [count] => 3
                [ddd] => 1
            ))效果已经有了 但是感觉可以简化的 求大神帮忙 我这个太复杂了
      

  8.   

    谢谢大牛
    代码简单 明了 读这样的代码就是一种享受 我简单装饰下
    <?php
    function two_array_add($arrayall,$array1){
    if(!is_array($arrayall)) return $array1;
    if(!is_array($array1)) return $arrayall;
    foreach($arrayall as $t) 
    $r[$t['id']] = $t; //按 id 建立索引
    foreach($array1 as $t) {
    if(isset($r[$t['id']])) $r[$t['id']]['count'] += $t['count'];
    else $r[$t['id']] = $t;
    }
    return array_values($r);
    }
    ?>