现有数组
$arr=array(
'0' => array ( 'userId' => 1,'date' => '2011-4-11', 'num' => '2' ),   
'1' => array ( 'userId' => 2,'date' => '2011-4-12', 'num' => '3' ),   
'2' => array ( 'userId' => 6,'date' => '2011-4-13', 'num' => '4')  
'3' => array ( 'userId' => 3,'date' => '2011-4-13', 'num' => '5')   
'4' => array ( 'userId' => 1,'date' => '2011-4-11', 'num' => '7')
'5' => array ( 'userId' => 1,'date' => '2011-4-12', 'num' => '7')      
);
如何将这个数组重新计算生成为
相同userid和data的合并求num的和
生成结果为
$arr=array(
'0' => array ( 'userId' => 1,'date' => '2011-4-11', 'num' => '9' ),   
'1' => array ( 'userId' => 2,'date' => '2011-4-12', 'num' => '3' ),   
'2' => array ( 'userId' => 6,'date' => '2011-4-13', 'num' => '4')  
'3' => array ( 'userId' => 3,'date' => '2011-4-13', 'num' => '5')   
'4' => array ( 'userId' => 1,'date' => '2011-4-12', 'num' => '7')      
);

解决方案 »

  1.   

    $arr=array(
    '0' => array ( 'userId' => 1,'date' => '2011-4-11', 'num' => '2' ),   
    '1' => array ( 'userId' => 2,'date' => '2011-4-12', 'num' => '3' ),   
    '2' => array ( 'userId' => 6,'date' => '2011-4-13', 'num' => '4'),   
    '3' => array ( 'userId' => 3,'date' => '2011-4-13', 'num' => '5'),   
    '4' => array ( 'userId' => 1,'date' => '2011-4-11', 'num' => '7'),
    '5' => array ( 'userId' => 1,'date' => '2011-4-12', 'num' => '7'),   
    );
    foreach($arr as $v) {
      if(! $r[$v['userId'].'_'.$v['date']])
        $r[$v['userId'].'_'.$v['date']] = $v;
      else
        $r[$v['userId'].'_'.$v['date']]['num'] += $v['num'];
    }
    print_r(array_values($r));Array
    (
        [0] => Array
            (
                [userId] => 1
                [date] => 2011-4-11
                [num] => 9
            )    [1] => Array
            (
                [userId] => 2
                [date] => 2011-4-12
                [num] => 3
            )    [2] => Array
            (
                [userId] => 6
                [date] => 2011-4-13
                [num] => 4
            )    [3] => Array
            (
                [userId] => 3
                [date] => 2011-4-13
                [num] => 5
            )    [4] => Array
            (
                [userId] => 1
                [date] => 2011-4-12
                [num] => 7
            ))
      

  2.   

    厉害!结果也是OK的。不过这个结构PHP会报警告级错误,需要顶部加error_reporting(0)来禁止错误!
      

  3.   


    另请教唠叨斑竹,有没有办法抑制这种NOTICE级的错误!
      

  4.   

    不显示notice可以用error_reporting (E_ALL & ~E_NOTICE);
      

  5.   

    另外如果我这个问题改变下有两个这样的数组
    $arr1=array(
    '0' => array ( 'userId' => 1,'date' => '2011-4-11', 'num' => '9' ),   
    '1' => array ( 'userId' => 2,'date' => '2011-4-12', 'num' => '3' ),   
    '2' => array ( 'userId' => 6,'date' => '2011-4-13', 'num' => '4'),   
    '3' => array ( 'userId' => 3,'date' => '2011-4-13', 'num' => '5'),   
    '4' => array ( 'userId' => 1,'date' => '2011-4-12', 'num' => '7'),   
    );
    $arr2=array(
    '0' => array ( 'userId' => 1,'date' => '2011-4-11', 'num' => '2' ),   
    '1' => array ( 'userId' => 2,'date' => '2011-4-12', 'num' => '3' ),   
    '2' => array ( 'userId' => 6,'date' => '2011-4-13', 'num' => '4'),   
    '3' => array ( 'userId' => 3,'date' => '2011-4-13', 'num' => '5'),   
    '4' => array ( 'userId' => 1,'date' => '2011-4-12', 'num' => '7'),   
    );怎么去变成
    $arr1=array(
    '0' => array ( 'userId' => 1,'date' => '2011-4-11', 'num' => '11' ),   
    '1' => array ( 'userId' => 2,'date' => '2011-4-12', 'num' => '6' ),   
    '2' => array ( 'userId' => 6,'date' => '2011-4-13', 'num' => '8'),   
    '3' => array ( 'userId' => 3,'date' => '2011-4-13', 'num' => '10'),   
    '4' => array ( 'userId' => 1,'date' => '2011-4-12', 'num' => '14'),   
    );
      

  6.   

    $arr = array_merge($arr1,$arr2);
    再引用2楼的
    foreach($arr as $v) {
      if(! $r[$v['userId'].'_'.$v['date']])
        $r[$v['userId'].'_'.$v['date']] = $v;
      else
        $r[$v['userId'].'_'.$v['date']]['num'] += $v['num'];
    }
    print_r(array_values($r));