我有一个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
任何帮助将不胜感激。
答案 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>
中的示例
答案 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]);