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时,将数据合并到前一个数组,结果相加。但是前一个数组的键名保持不变。保存为一个新的数组。这样怎么求?
[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
)
建议你暂时搁置一下你的思路,看看我的代码。应该对你有帮助
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' );
我的问题不是那个小计合计问题了。我现在只是将dd_wh的值计入dd,dd键名保持不变这样的。
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);
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);