合并PHP和HTML中的行

时间:2012-09-24 07:38:53

标签: php html css

我有一个PHP数组,它有几个不同的字段。对于某些行,id和name是相同的,其余数据是不同的。

我想在HTML表格中显示数据而不会多次列出重复数据。我意识到我可以使用colspan / rowspan来合并表格单元格,但我不确定如何根据匹配值进行计数/求和。

以下是我的表格如下:

Id      Name     value1      value2       value3
2312     ABC     test        test2         test3   
2312     ABC     XYz          122           211
2455     XYZ     val11        val2          val3

任何帮助将不胜感激。

6 个答案:

答案 0 :(得分:2)

我建议你创建一个新的多维数组并合并具有相同ID的数组......其余的将很容易。看看我做过的例子

<?
 $init_array = array(
  array('id'=>2312, 'name'=>'ABC', 'value1'=>'asda', 'value2'=>'sdf', 'value3'=>'dfg'),
  array('id'=>2312, 'name'=>'ABC', 'value1'=>'asd', 'value2'=>'fgd', 'value3'=>'ret'),
  array('id'=>2455, 'name'=>'XYZ', 'value1'=>'sdgg', 'value2'=>'rew', 'value3'=>'gdg'),
 );
 $formatted_array = array();

 foreach( $init_array as $element ) {
  $formatted_array[ $element['id'] ][] = $element;
 }
?>

<table border="2">
 <? foreach($formatted_array as $row ): ?>
   <tr>
     <td rowspan="<?=count($row)?>"><?=$row[0]['id']?></td>
     <td rowspan="<?=count($row)?>"><?=$row[0]['name']?></td>
     <? foreach( $row as $value ): ?>
      <td><?=$value['value1']?></td>
      <td><?=$value['value2']?></td>
      <td><?=$value['value3']?></td>
      </tr><tr>
     <? endforeach; ?>
   </tr>
 <? endforeach; ?>
</table>

CodePad

中的示例

答案 1 :(得分:1)

关键是使用二维数组来存储每个单元格的大小(rowspan)值,如果我们不需要单元格,则它的大小为零。

这是一个示例代码。您可能需要先对数组进行排序。

<?php
$rows = array(
    array(2312, 'ABC', 'asda', 'sdf', 'dfg'),
    array(2312, 'ABCD', 'asd', 'fgd', 'ret'),
    array(2313, 'ABCD', 'asd', 'fgd', 'ret'),
    array(2455, 'XYZ', 'sdgg', 'rew', 'gdg'),
);

function try_merge_col( &$rows, &$trs, &$tr, $row_i, $col_i )
{
    $row = $rows[$row_i];
    $old = $rows[$row_i-1];
    if( $row[$col_i] == $old[$col_i] )
    {
        $tr[$col_i]=0; //throw it
        for( $k = $row_i-1; $k>=0; $k-- ) //from down to up
        {
            if( $trs[$k][$col_i] > 0 ) { //do merge
                $trs[$k][$col_i]++;
                break;
            }   
        }   
    }   
}   

function get_table( $rows )
{
    $ret = "";
    $trs = array(
        array(1,1,1,1,1)
        ); //used to store cell size
    $last_row = null;
    for( $i = 1; $i < count($rows); $i++ )
    {
        $this_tr = array(1,1,1,1,1);
        try_merge_col( $rows, $trs, $this_tr, $i, 0 ); //id
        try_merge_col( $rows, $trs, $this_tr, $i, 1 ); //name
        array_push( $trs, $this_tr );
    }   
    for( $i = 0; $i < count($rows); $i++ )
    {
        $tr = $trs[$i];
        $ret .= "<tr>";
        for( $j=0 ; $j<5 ; $j++ )
        {
            if( $tr[$j] >= 1 )
            {
                if( $tr[$j] > 1 ) $ret .= "<td rowspan=\"".$tr[$j]."\">";
                else $ret .= "<td>";   
                $ret .= $rows[$i][$j]; 
                $ret .= "</td>";
            }   
        }   
        $ret .= "</tr>";
    }   
    return $ret;
}   

echo get_table( $rows );
?>

答案 2 :(得分:0)

Sort数组。

每次保存ID和名称,然后在每行的开头,检查ID&amp;名称与最后一个名称相同。如果是 - 合并行。

答案 3 :(得分:0)

看起来你可能只需要为每一行运行一个for循环&amp;专栏。

一些粗糙的伪代码:

idArray = [];
idVal_Dict = {};

for col in table{ // Run through each Column ..
    if col == 1{
        for id in col1{
            if ! id == 1{ // If we're on the first column ..
                idArray.append(id.value()); // append id value ..
            }
        }
    }else{
        for val in col{ // For Other columns, find the matching ID & store to a dictionary ..
            idVal_Dict[val.value()] = idArray[val];
        }
    }

答案 4 :(得分:0)

我实际上不知道你要在表格中显示两行中具有相同Id的不同数据。但我认为你应该在你的php代码中合并值(不在视图中),然后将它们作为清晰数据发送到视图。因此,您可以检查相等的ID值,并在合并之前获得它们的总和。

答案 5 :(得分:-1)

使用PHP的if else语句检查ID的数量,然后应用foreach循环来显示信息。我认为它应该这样工作。您使用count作为

count($data[id]);