6

我有一个 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

任何帮助将不胜感激。

4

6 回答 6

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中的示例

于 2012-09-24T07:59:10.217 回答
1

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

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

<?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 );
?>
于 2012-09-24T08:53:30.910 回答
0

看起来您可能只需要在考虑每一行和每一列的情况下运行一个 for 循环。

一些粗略的伪代码:

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];
        }
    }
于 2012-09-24T07:50:07.970 回答
0

对数组进行排序。

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

于 2012-09-24T07:47:38.633 回答
0

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

于 2012-09-24T08:00:57.963 回答
-1

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

count($data[id]);
于 2012-09-24T07:51:00.103 回答