计算消除数组中的重复关联值

时间:2009-12-07 10:28:03

标签: php

我有以下问题,我有一个名为$ data

的数组

在这个数组中我有类似

的东西
[6] => Array
        (
            [code] => 642
            [total] => 1708
        )

    [7] => Array
        (
            [code] => 642
            [total] => 53
        )

    [8] => Array
        (
            [code] => 642
            [total] => 1421
        )

在某些元素中,代码值是相同的,现在我想要做的是将所有元素合并在一起的相同代码值,并将总数加在一起。我尝试在foreach循环中执行此操作,但似乎不起作用。

我这样做

$old_lc = null;
        $old_lcv = 0;
        $count = 0;
        $dd = null;


        foreach($data as $d){

            if($d['code'] == $old_lc){
                $d['total'] = $d['total'] + $old_lcv;
                $count--;
                $dd[$count]['code'] = $d['code'];
                $dd[$count]['total'] = $d['total'];

            }else{
                $dd[$count]['code'] = $d['code'];
                $dd[$count]['total'] = $d['total'];
                $count++;

            }

            $old_lc = $d['code'];
            $old_lcv = $d['total'];
        }

        $data = $dd;

但这似乎不起作用。另外我需要$ data数组来保存密钥,并且应该保持相同的格式

3 个答案:

答案 0 :(得分:3)

  $result = array();
  foreach($ary as $elem) {
     $code = $elem['code'];
     $total = $elem['total'];
     if(!isset($result[$code]))
          $result[$code] = 0;
     $result[$code] += $total;
  }

答案 1 :(得分:2)

此代码将上述数组转换为code =>数组。总

$out = array();
foreach ($data as $k => $v) {
  $out[$v['code']] += $v['total'];
}

值得注意的是,在某些设置中,这将生成有关未定义索引的警告。如果这困扰你,你可以使用这个备用版本:

$out = array();
foreach ($data as $k => $v) {
  if (array_key_exists($v['code'], $out)) {
    $out[$v['code']] += $v['total'];
  } else {
    $out[$v['code']] = $v['code'];
  }
}

如果这就是你想要的东西,它会把它变回原来的东西:

$output = array();
foreach ($out as $code => $total) {
  $output[] = array('code' => $code, 'total' => $total);
}

注意: $data的原始密钥未得到维护,但未说明这是一项要求。如果是,则需要指定如何重建具有相同代码的多个元素。

答案 2 :(得分:0)

    [6] => Array
        (
            [code] => 642
            [total] => 1708
        )

    [7] => Array
        (
            [code] => 642
            [total] => 53
        )

    [8] => Array
        (
            [code] => 642
            [total] => 1421
        )

$data_rec = array();
$data = array();
foreach($data_rec as $key=>$rec)
{
   $data[$key]+= $rec[$key];
}
print_r($data);