6

いくつかの異なるフィールドを持つPHP配列があります。一部の行では、IDと名前が同じで、残りのデータが異なります。

重複したデータを複数回リストせずに、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

重要なのは、2次元配列を使用して各セルのsize(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 );
?>
于 2012-09-24T08:53:30.910 に答える
0

配列を並べ替えます。

毎回IDと名前を保存し、各行の先頭で、IDと名前が最後のものと同じであるかどうかを確認します。もしそうなら-行をマージします。

于 2012-09-24T07:47:38.633 に答える
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

2行に同じIDを持つ異なるデータをテーブルに表示する予定があるかどうかは実際にはわかりません。ただし、PHPコード(ビューではない)の値をマージしてから、クリアデータとしてビューに送信する必要があると思います。したがって、ID値が等しいかどうかを確認し、マージする前にそれらの合計を取得できます。

于 2012-09-24T08:00:57.963 に答える
-1

PHPのifelseステートメントを使用してIDの数を確認してから、foreachループを適用して情報を表示します。私はそれがそのように働くべきだと思います。カウントを使用します

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