Array(
    [0] => dt
    [department] => dt
    [1] => 82.9
    [item_real] => 82.9
    [2] => 59.8
    [item1] => 59.8
    [3] => 51.0
    [item2] => 51.0
    [4] => 0.0
    [item3] => 0.0
    [5] => 0.0
    [item4] => 0.0
    [6] => 0.0
    [item5] => 0.0
    [7] => 0.0
    [item6] => 0.0
    [8] => 197.4
    [item_budget] => 197.4
    [9] => 55.5
    [tuisuan] => 55.5
    [tuisuan_status] => D
    [current_status] => D
)
Array(
    [0] => dt2
    [department] => dt2
    [1] => 0.0
    [item_real] => 0.0
    [2] => 0.0
    [item1] => 0.0
    [3] => 643.6
    [item2] => 643.6
    [4] => 0.0
    [item3] => 0.0
    [5] => 0.0
    [item4] => 0.0
    [6] => 0.0
    [item5] => 0.0
    [7] => 0.0
    [item6] => 0.0
    [8] => 1173.5
    [item_budget] => 1173.5
    [9] => 321.8
    [tuisuan] => 321.8
    [tuisuan_status] => D
    [current_status] => D
)
Array(
    [0] => dd
    [department] => dd
    [1] => 39.2
    [item_real] => 39.2
    [2] => 44.3
    [item1] => 44.3
    [3] => 53.1
    [item2] => 53.1
    [4] => 0.0
    [item3] => 0.0
    [5] => 0.0
    [item4] => 0.0
    [6] => 0.0
    [item5] => 0.0
    [7] => 0.0
    [item6] => 0.0
    [8] => 181.4
    [item_budget] => 181.4
    [9] => 48.9
    [tuisuan] => 48.9
    [tuisuan_status] => D
    [current_status] => D
)
Array(
[0] => dd_wh
    [department] => dd_wh
    [1] => 12.5
    [item_real] => 12.5
    [2] => 4.5
    [item1] => 4.5
    [3] => 38.7
    [item2] => 38.7
    [4] => 0.0
    [item3] => 0.0
    [5] => 0.0
    [item4] => 0.0
    [6] => 0.0
    [item5] => 0.0
    [7] => 0.0
    [item6] => 0.0
    [8] => 53.2
    [item_budget] => 53.2
    [9] => 21.6
    [tuisuan] => 21.6
    [tuisuan_status] => D
    [current_status] => D
)
当department为dt2或者dd_wh时,将数据合并到前一个数组,结果相加。但是前一个数组的键名保持不变。保存为一个新的数组。这样怎么求?

解决方案 »

  1.   

    就foreach追加吧,看现在这个几个数组的结构,不应该只是一个简单的合并吧可以去看看array_merge
      

  2.   

    我重新贴一下:Array(
        [department] => dt
        [item_real] => 82.9
        [item1] => 59.8
        [item2] => 51.0
        [item3] => 0.0
        [item4] => 0.0
        [item5] => 0.0
        [item6] => 0.0
        [item_budget] => 197.4
        [tuisuan] => 55.5
    )
    Array(
        [department] => dt2
        [item_real] => 0.0
        [item1] => 0.0
        [item2] => 643.6
        [item3] => 0.0
        [item4] => 0.0
        [item5] => 0.0
        [item6] => 0.0
        [item_budget] => 1173.5
        [tuisuan] => 321.8
    )
    Array(
        [department] => dd
        [item_real] => 39.2
        [item1] => 44.3
        [item2] => 53.1
        [item3] => 0.0
        [item4] => 0.0
        [item5] => 0.0
        [item6] => 0.0
        [item_budget] => 181.4
        [tuisuan] => 48.9
    )
    Array(
        [department] => dd_wh
        [item_real] => 12.5
        [item1] => 4.5
        [item2] => 38.7
        [item3] => 0.0
        [item4] => 0.0
        [item5] => 0.0
        [item6] => 0.0
        [item_budget] => 53.2
        [tuisuan] => 21.6
    )
      

  3.   

    你这个问题纠结的太久了。
    建议你暂时搁置一下你的思路,看看我的代码。应该对你有帮助
    class crosstab {
      var $math_field = array();
      var $group_field = array();
      var $data = array();
      function append($d) {
        $p =& $this->data;
        if(! $p['t']) {
          $p['t'] = $d;
        }else foreach($this->math_field as $i) $p['t'][$i] += $d[$i];
        $p =& $p['child'];
        foreach($this->group_field as $k=>$h) {
          $key = $d[$k];
          if(! $p[$key]['t']) {
            $p[$key]['t'] = $d;
            $p[$key]['n'] = $key;
            $p[$key]['g'] = $k;
            unset($p[$key]['t'][$k]);
            $p[$key]['t'][$this->leaves] = $h;
          }else {
            unset($d[$k]);
            foreach($this->math_field as $i) $p[$key]['t'][$i] += $d[$i];
          }
          $last =&$p[$key];
          $p =& $p[$key]['child']; 
        }
        $last['d'][] = $d;
        $this->count( $this->data['child'] );
      }
      function count(&$ar) {
        foreach($ar as $k=>&$v) {
          if( $v['child'] ) {
            $cnt += $v['c'] = $this->count($v['child']);
          }else {
            if(($c = count($v['d'])) > 1) {
              $c++;
            }
            $cnt += $v['c'] = $c;
          }
        }
        return $cnt == 1 ? 1 : $cnt + 1;
      }
      function display($fmt='') {
        if($this->show_field) $show_field = $this->show_field;
        else
          $this->show_field = $show_field = array_combine($p = array_keys($this->data['t']), $p);
        echo "<table $fmt>";
        echo '<tr><th>' . join('</th><th>', $show_field) . '</th></tr>';
        $this->display_callback($this->data);
        echo '</table>';
      }
      function display_callback(&$ar, $group=array()) {
        foreach($ar['child'] as $k=>$v) {
          if($v['d']) {
            if(($cnt = $v['c']) > 1)  $v['d'][] = $v['t'];
            foreach($v['d'] as $i=>$row) {
              echo '<tr>';
              foreach($this->show_field as $key=>$vv) {
                if(isset($row[$key])) {
                  if($i == 0 && in_array($key, array_keys($this->group_field)) ) {
                    if( $group[$key] ) {
                      echo "<td rowspan={$group[$key]}>{$row[$key]}</td>";
                      unset($group[$key]);
                    }else if( $v['c'] ) {
                      echo "<td rowspan={$v['c']}>{$row[$key]}</td>";
                    }
                  }else
                    echo '<td>' . $row[$key] . '</td>';
                }
              }
              echo "</tr>\n";
            }
          }
          if($v['child']) {
            if($v['g'] && $v['c']>1) $group[$v['g']] = $v['c'];
            $this->display_callback($v, $group);
              echo '<tr>';
              foreach($this->show_field as $key=>$vv) {
                if( isset($v['t'][$key])) echo '<td>' . $v['t'][$key] . '</td>';
              }
              echo "</tr>\n";
          }
        }
      }
    }$math_field = array( 'item_real', 'item_budget', 'item_current_predict', 'item_current_real', 'item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'tuisuan' );
    $group_filed = array( 'localcation' => '合计', 'project' => '小计' );$p = new crosstab;
    $p->math_field = $math_field;
    $p->group_field = $group_filed;
    $p->leaves = 'project_category';
     
    $rs = mysql_query('select * from budgetcontrol order by num');
    while($row = mysql_fetch_assoc($rs)) {
      $p->append($row);
    }$p->display( 'border=1' );
      

  4.   


    我的问题不是那个小计合计问题了。我现在只是将dd_wh的值计入dd,dd键名保持不变这样的。
      

  5.   

    $ar =array(
    array(
        'department' => 'dt2',
        'item_real' => 0.0,
        'item1' => 0.0,
        'item2' => 643.6,
        'item3' => 0.0,
        'item4' => 0.0,
        'item5' => 0.0,
        'item6' => 0.0,
        'item_budget' => 1173.5,
        'tuisuan' => 321.8
    ),
    array(
        'department' => 'dd_wh',
        'item_real' => 12.5,
        'item1' => 4.5,
        'item2' => 38.7,
        'item3' => 0.0,
        'item4' => 0.0,
        'item5' => 0.0,
        'item6' => 0.0,
        'item_budget' => 53.2,
        'tuisuan' => 21.6,
    )
    );
    $arResult = $ar[0];
    $arResult['department'] = 'dt2+dd_wh';
    for($i = 1; $i < count($ar); $i ++) {
       if ($ar[$i]['department'] == 'dt2' || $ar[$i]['department'] == 'dd_wh') {
          foreach($ar[$i] as $k => $v) {
             if ($k != 'department') $arResult[$k] += $ar[$i][$k];
          }
       }
    }
    echo "<pre>\n";
    print_r($arResult);
      

  6.   

    上面发的那个有问题。。$ar =array(
    array(
        'department' => 'dt2',
        'item_real' => 0.0,
        'item1' => 0.0,
        'item2' => 643.6,
        'item3' => 0.0,
        'item4' => 0.0,
        'item5' => 0.0,
        'item6' => 0.0,
        'item_budget' => 1173.5,
        'tuisuan' => 321.8
    ),
    array(
        'department' => 'dd_wh',
        'item_real' => 12.5,
        'item1' => 4.5,
        'item2' => 38.7,
        'item3' => 0.0,
        'item4' => 0.0,
        'item5' => 0.0,
        'item6' => 0.0,
        'item_budget' => 53.2,
        'tuisuan' => 21.6,
    )
    );
    $arResult = array();
    $keys = array_keys($ar[0]);
    foreach($keys as $v) $arResult[$v] = 0;
    $arResult['department'] = 'dt2+dd_wh';for($i = 0; $i < count($ar); $i ++) {
       if ($ar[$i]['department'] == 'dt2' || $ar[$i]['department'] == 'dd_wh') {
          foreach($ar[$i] as $k => $v) {
             if ($k != 'department') $arResult[$k] += $ar[$i][$k];
          }
       }
    }
    echo "<pre>\n";
    print_r($arResult);