2017-03-29 13 views
0

アロ、PHPマップ配列データのHTMLテーブルに一部のHTMLテーブルの列

をスキップしながら、私は、PHPでこの配列があります。

$data=array(1,2,3,4,5,6,7,8); 

を私はHTMLテーブルに入れたい、以下の構造を有しています(画像)

enter image description here

着色列が完全にスキップされることになります。私は次の表の構造を与える

$totalColumnsPerRow=8; 
$skippableColumns=array(3,6,7,8); 
$counter=1; 
//loop the array now 
$row="<tr>"; 
foreach($data as $val){ 
//do we need to start a new row or not? 
if ($counter==$totalColumnsPerRow){ 
//close open row and create a new one. 
$counter=1; 
$row.="</tr><tr>": 
    } 

//show I skip the current column or not? 
if(in_array($counter,$skippableColumns)){ 
//skip column then add current value 
$row.="<td></td>"; 
$row.="<td>$val</td>"; 
} 
else{ 
$row.="<td>$val</td>"; 
    } 
$counter++; 
} 

:私はとにかく私の試みがあり、ここでこれを行うに失敗しましたが、しています。それが成功した行をスキップしていた場合、新しい行は、値5

enter image description here

で始まっているだろう。ここPHP fiddle

ループを一時停止し、使用可能な列でそれを使用したいとする方法上の任意のアイデアです?私のアプローチは実用的ですか?

+0

各行に別々のループを追加しようとします。 – dehood

+0

非常に遅い処理になりますが、それでもまだショットが残っているようです。 –

答えて

1

コードを変更しました。以下を試してください。より良い理解のためのコメントを追加しました。

<table border="1" width="600px"> 
<tr> 
<td>A</td><td>B</td><td>ABT</td><td>C</td><td>D</td><td>CDT</td><td>ACT</td><td>TTT</td> 
</tr> 

<?php 

$data = array(1,2,3,4,5,6,7,8); 
$totalColumnsPerRow = 8; 
$skippableColumns = array(3,6,7,8); 

$table = '<tr>'; 
$lastIndex = 0; 

for($i = 1; $i <= $totalColumnsPerRow; $i++) { // Per column 

    if(in_array($i, $skippableColumns)) { // Skipping coulmn value 
     $table .= '<td></td>'; 
    } else { // Adding coulmn value 
     $table .= '<td>'.$data[$lastIndex].'</td>'; 
     $lastIndex++; // Incrementing data index 
    } 

    if($i == $totalColumnsPerRow) { // Last column 
     $table .= '</tr>'; // Ending row 

     if($lastIndex <= count($data) -1) { // Data left 
      $table .= '<tr>'; // Starting new row 

      $i = 0; // Resetting so in the next increment it will become 1 
     } 
    } 
} 

echo $table; 
?> 

出力はめったに使われない、多くはgoto制御を中傷して、私は(同じ$ valのデータを使用して)同じループ内で再確認するようにコードを修正 enter image description here

+0

魅力的な作品です。 Lemmeは他の提案を見て比較する。ありがとう。とても明確で効率的です。 –

+0

@NieSelam喜んで私はあなたを助けることができました –

0

です。既存のコードへの最小限の変更。

foreach($data as $val){ 
    //we'll come back here to decide on skip or write of next row when a skippable is encountered 
    //this keeps us locked onto the same $val until it is written out 
    recheck: 
    //do we need to start a new row or not? 
    if ($counter==$totalColumnsPerRow){ 
    //close open row and create a new one. 
     $counter=1; 
     $row.="</tr><tr>"; 
    } 

    //show I skip the current column or not? 
    if(in_array($counter,$skippableColumns)){ 
    //skip column then add current value 
     $row.="<td></td>"; 
     $counter++; 
     goto recheck; 
    // $row.="<td>$val</td>"; 
    } 
    else{ 
     $row.="<td>$val</td>"; 
    } 
    $counter++; 
} 
関連する問題