3

colspan行のアイテム数に基づいて必要に応じて追加できるように、列を変更できますか?

シナリオ:

5 つのアイテムがあるとします。1 つの行/4 列が必要で、次の行には colspan="4" の 1 列が必要です

6 つのアイテムがあるとします。1 行 / 4 列、次の行、colspan="2" の 2 列が必要です。

7 つのアイテムがあるとします。1 行 / 4 列、次の行、2 列、colspan なし、+ colspan="2" の 1 列が必要です。

これが私の既存のコードです:

        echo '<table width="100%" cellpadding="10" cellspacing="5">' . PHP_EOL;

        $colSpan = 4;
        $rows = 0;
        for($i = 0; $i < $tmpCt; $i++) {
            // At column 0 you create a new row <tr>
            if($i % $colSpan == 0) {
                $rows++;
                echo "<tr>\n";
            }
            // if only 1 item in the row, need to add colspan="4", 2 items colspan="2" for 2 <td>'s, 3 items 1 @ colspan="2" + 2 <td>'s
            echo '<td width="25%" align="center" valign="middle">' . $tmpRet[$i]['sponName'] . '</td>' . PHP_EOL;

            // At column 3 you end the row </tr>
            echo $i % $colSpan == 3 ? "</tr>\n" : "";
        }
        // Say you have 5 columns, you need to create 3 empty <td> to validate your table!
        for($j = $i; $j < ($colSpan * $rows); $j++) {
            echo "<td>&nbsp;</td>\n";
        }
        // Add the final <tr>
        if(($colSpan * $rows) > $i) {
            echo "</tr>\n";
        }


        echo '</table>';
4

2 に答える 2

4

まあ、それは算数が役に立つときです!
必要なのは、各レベルでモジュロ演算を使用することです。

これが私の解決策です:

$tmpRet = array(
    array(1),
    array(1, 2, 3),
    array(1, 2, 3, 4, 5, 6, 7), 
    array(1, 2, 3, 4, 5),
    array(1, 2),
    array(1, 2, 3, 4, 5, 6), 
    array(),
    array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16),
    array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
);
$lencol = count($tmpRet);

echo '<table border="1" width="800px" cellpadding="10" cellspacing="5">'.PHP_EOL;
$colspan = 4;

for($i = 0; $i < $lencol; $i++) {
  $bg = 'style="background-color: #'.rand(100, 999).'"';
  $row = $tmpRet[$i];
  $lc = count($row);
  $offset = 0;

  if ($lc>$colspan) {
    $ct = floor($lc/$colspan);
    $offset = $ct * $colspan;
      $m = 0;
    for ($k = 0; $k<$ct; $k++) {
      echo '<tr '.$bg.' >';
      for ($l = 0; $l<$colspan; $l++) {
        echo '<td>'.$row[$m].'</td>';
        $m++;
      }
      echo '<tr>';
    }
  }
  $mod = $lc % $colspan;
  switch ($mod) {
    case 1:
      echo '<tr '.$bg.' ><td colspan="4">'.$row[$offset].'</td></tr>';
    break;
    case 2:
      echo '<tr '.$bg.' ><td colspan="2">'.$row[$offset].'</td><td colspan="2">'.$row[$offset+1].'</td></tr>';
    break;
    case 3:
      echo '<tr '.$bg.' ><td>'.$row[$offset].'</td><td>'.$row[$offset+1].'</td><td colspan="2">'.$row[$offset+2].'</td></tr>';
    break;
  }
}

echo '</table>';

そして、これは次のようになります。

例

お役に立てれば

編集:これは$colspan=4、switchステートメントを別のものに置き換えることをより動的にする必要がある場合にのみ機能します...おそらくネストされたループ...

于 2013-08-29T05:12:29.770 に答える
1

入力として配列と列数を取り、質問の要件を実行する一般化された関数を作成しました。私は自分の側からそれをテストしました。テストして問題が見つかったらお知らせください

<?php
function test($arr,$colspan) {
    $count = count($arr);


    $extra_elements = $count % $colspan;
    $num_of_rows=($count-$extra_elements)/$colspan;

    //print $extra_elements . " hhhhh" . $num_of_rows;
    $current_count = 0;
    print "<table>";
    for($i=0;$i<$num_of_rows;$i++) {
        print "<tr>";
        for($j=0;$j<$colspan;$j++) {
            $bg = 'style="background-color: #'.rand(100, 999).'"';
            print "<td $bg>" . $arr[$current_count] . "</td>";
            $current_count++;
        }
        print "</tr>";
    }

    if($extra_elements>0) {
        print "<tr>";
        $divisor = $colspan%$extra_elements;
        if($divisor==0 && $extra_elements!=1) {
                $last_row_span = $colspan/$extra_elements;
                while($current_count<$count) {
                    $bg = 'style="background-color: #'.rand(100, 999).'"';
                    print "<td colspan='$last_row_span' $bg>" . $arr[$current_count] . "</td>";
                    $current_count++;
                }
        }
        else {
                $j=0;
                while($current_count<$count-1) {
                    $bg = 'style="background-color: #'.rand(100, 999).'"';
                    print "<td $bg>" . $arr[$current_count] . "</td>";
                    $current_count++;
                    $j++;
                }
                $last_row_span = $colspan-$j;
                $bg = 'style="background-color: #'.rand(100, 999).'"';
                print "<td colspan='$last_row_span' $bg>" . $arr[$current_count] . "</td>";
        }       
        print "</tr>";
    }

    print "</table>";
}
$arr=array(0,1);
test($arr,4);
?>
于 2013-08-31T14:09:20.380 に答える