Php 在偶数行中包含ueven cells元素的HTML表(colspan)

Php 在偶数行中包含ueven cells元素的HTML表(colspan),php,html,html-table,Php,Html,Html Table,我试图建立一个非常简单的图表或流程图表示的建筑物 $floors = array( array( 'app_1','app_2','app_2_A' ), array( 'app_3','app_4','app_5'), array( 'app_6','app_7', 'app_8','app_9') , array( '

我试图建立一个非常简单的图表或流程图表示的建筑物

$floors = array(     array( 'app_1','app_2','app_2_A' ),
                            array( 'app_3','app_4','app_5'),
                            array( 'app_6','app_7', 'app_8','app_9') ,
                            array( 'app_10','app_11', 'app_12','app_13') ,
                            array( 'app_14','app_15', 'app_16') ,
                ); 

echo "<table border='2'>";

foreach ($floors as $floor ) {

    $total_app = count( $floor);

    echo "<tr>";

     for($i = 0;$i < $total_app; $i++){
      echo "<td colspan=" .$total_app.  ">";
          echo $floor[$i] . ' ( ' . $total_app . ' ) '; //brackets only for debug
           echo "</td>";
     }

    echo  "</tr>";

}   


echo "</table>";
因此,任何试图“硬编码”colspan计算的尝试都将失败。。 我需要行(楼层)的宽度相等,并且单元格(公寓)填充每一行,以这样的方式填充,例如,如果我有2个公寓,每个公寓的宽度将为50%,如果我有4个公寓,每个公寓的宽度将为25%,3个公寓-33%,依此类推


问题是如果可能的话,如何使用
colspan
或任何其他方法来实现这一点。

首先,colspan是一个独立的行,该行有3列,但我希望该行在单个单元格中合并所有列,您可以使用colspan

<?
$max_app = 0;
foreach( $floors as $floor ){
    $max_app = max(count($floor), $max_app);
}

echo "<table border='2'>";
foreach( $floors as $floor ){
    echo "<tr>";
    for( $a=0;$a<count($floor);$a++ ){
        if( $a+1 == count($floor) && $a+1 < $max_app ){
            //last cell, total number of cell in floor does not equals to $max_app
            echo "<td colspan='" . ($max_app - $a) . "'>";
        }else{
            echo "<td>";
        }
        echo $floor[$a];
        echo "</td>";
    }
    echo "</tr>";
}
echo "</table>";
?>

你想要这样的东西吗???试试这个

$floors = array(     array( 'app_1','app_2','app_2_A' ),
                            array( 'app_3','app_4','app_5'),
                            array( 'app_6','app_7', 'app_8','app_9') ,
                            array( 'app_10','app_11', 'app_12','app_13') ,
                            array( 'app_14','app_15', 'app_16') ,
                ); 

echo '<div style="border:#000000 solid 2px; padding:2px;width:100%;" >';

foreach ($floors as $floor ) {

    $total_app = count( $floor);

    echo '<div style=" padding:2px;" > ';

     for($i = 0;$i < $total_app; $i++){
      echo '<div style="border:#0000cc solid 1px; float:left; padding:2px;width:100px;" >';
          echo $floor[$i] . ' ( ' . $total_app . ' ) '; //brackets only for debug
           echo '</div> ';
     }

    echo  '</div> <br> <br> ';

}   


echo '</div>';
$floors=array(数组('app_1'、'app_2'、'app_2_A'),
数组('app_3'、'app_4'、'app_5'),
数组('app_6'、'app_7'、'app_8'、'app_9'),
数组('app_10'、'app_11'、'app_12'、'app_13'),
数组('app_14'、'app_15'、'app_16'),
); 
回声';
foreach($floor作为$floor){
$total_app=计数($floor);
回声';
对于($i=0;$i<$total_app;$i++){
回声';
echo$floor[$i].('.$total_app.');//括号仅用于调试
回声';
}
回音“

”; } 回声';
替代解决方案:DIV

<style>
    .floor{ width: 800px; border: 1px solid red; padding: 4px; margin: 6px 0px; }
    .app{ width: 110px; float: left; padding: 2px; margin: 0px 4px; border: 1px solid blue; }
    .spacer{clear: both; }
</style>

<?
foreach( $floors as $floor ){
    echo "<div class='floor'>";
    for( $a=0;$a<count($floor);$a++ )
        echo "<div class='app'>{$floor[$a]}</div>";
    echo "<div class='spacer'></div>";
    echo "</div>";
}
?>

.地板{宽度:800px;边框:1px纯红;填充:4px;边距:6px 0px;}
.app{width:110px;float:left;padding:2px;margin:0px 4px;border:1px纯蓝色;}
.spacer{clear:两者;}

正如你在上面得到了正确的答案,但这里也有一个

$floors = array(     array( 'app_1','app_2','app_2_A' ),
                            array( 'app_3','app_4','app_5'),
                            array( 'app_6','app_7', 'app_8','app_9','app_90') ,
                            array( 'app_10','app_11', 'app_12','app_13') ,
                            array( 'app_14','app_15', 'app_16') ,
                ); 
$maxCol = 0;
foreach($floors as $f){
  $curCnt = count($f);

  if($maxCol < $curCnt) $maxCol = $curCnt;
}

echo "<table border='2'>";

foreach ($floors as $floor ) {

    $total_app = count( $floor);
    $colSpan = $maxCol%$total_app;

    echo "<tr>";

     for($i = 0;$i < $total_app; $i++){
      echo "<td colspan=" .(($i==($total_app-1))?$colSpan+1:1).  ">";
          echo $floor[$i] . ' ( ' . $total_app . ' ) '; //brackets only for debug
           echo "</td>";
     }

    echo  "</tr>";

}   


echo "</table>";
$floors=array(数组('app_1'、'app_2'、'app_2_A'),
数组('app_3'、'app_4'、'app_5'),
数组('app_6'、'app_7'、'app_8'、'app_9'、'app_90'),
数组('app_10'、'app_11'、'app_12'、'app_13'),
数组('app_14'、'app_15'、'app_16'),
); 
$maxCol=0;
foreach(楼层为$f){
$curCnt=计数($f);
如果($maxCol<$curCnt)$maxCol=$curCnt;
}
回声“;
foreach($floor作为$floor){
$total_app=计数($floor);
$colSpan=$maxCol%$total_应用程序;
回声“;
对于($i=0;$i<$total_app;$i++){
回声“;
echo$floor[$i].('.$total_app.');//括号仅用于调试
回声“;
}
回声“;
}   
回声“;

1-并非所有单元格都需要具有相同的宽度-但所有
行都需要相同的宽度。(楼层)。2-您的解决方案给出了未定义的索引错误,我可以修复,但是-它不适用于所有配置-请参阅我的编辑Ithx,并修改了代码,从屏幕截图中查看:这更好。。但我的目标是让单元格填满这一行,。因此,如果只有2个单元格,每个单元格将占总数的一半..查看我的“编辑1”部分,但布局不等于您的副本。是的!!这就是我需要的。而且效果很好!我缺少的是:`$percent=ceil(100/计数($floor));`。。完美的谢谢不,您在那里做的只是将表更改为divs,结果是一样的。。我需要的是,无论有多少个单元格,单元格都要填满整行的内容。是的,请看第二个例子中的@Allen Chak Edit。。问题是如何使用
colspan
再次实现这一点,最初的问题是我需要行(楼层)的宽度相等,并需要单元格将其填满。因此,如果我有3个单元(装置),每个单元将是33%,如果我有两个单元,每个单元将是50%,如果我有4个单元,每个单元将是25%,依此类推。。。我想知道如何计算
colspan
。@ObmerkKronen,请查看本节,仅使用DIV。PS,有一个很小的错误,一个像素将丢失,因为它不能真正除以列,如3,7,9等
<style>
    .floor{ width: 800px; border: 1px solid red; padding: 4px; margin: 6px 0px; }
    .app{ width: 110px; float: left; padding: 2px; margin: 0px 4px; border: 1px solid blue; }
    .spacer{clear: both; }
</style>

<?
foreach( $floors as $floor ){
    echo "<div class='floor'>";
    for( $a=0;$a<count($floor);$a++ )
        echo "<div class='app'>{$floor[$a]}</div>";
    echo "<div class='spacer'></div>";
    echo "</div>";
}
?>
<style>
    .floor{ width: 810px; border: 1px solid red; padding: 4px; margin: 6px 0px; }
    .app{ float: left; padding: 2px; margin: 0px 4px; border: 1px solid blue; }
    .spacer{clear: both; }
</style>

<?
foreach( $floors as $floor ){
    echo "<div class='floor'>";
    // 14px = 2 x (app.border: 1 + app.padding: 2 + app.margin: 4)
    // 800px = floor.width - ( 2 x (floor.border: 1 + floor.padding: 4) )
    $percent = floor( 1 / count($floor) * 800) - 14;
    for( $a=0;$a<count($floor);$a++ )
        echo "<div class='app' style='width: {$percent}px'>{$floor[$a]}</div>";
    echo "<div class='spacer'></div>";
    echo "</div>";
}
?>
$floors = array(     array( 'app_1','app_2','app_2_A' ),
                            array( 'app_3','app_4','app_5'),
                            array( 'app_6','app_7', 'app_8','app_9','app_90') ,
                            array( 'app_10','app_11', 'app_12','app_13') ,
                            array( 'app_14','app_15', 'app_16') ,
                ); 
$maxCol = 0;
foreach($floors as $f){
  $curCnt = count($f);

  if($maxCol < $curCnt) $maxCol = $curCnt;
}

echo "<table border='2'>";

foreach ($floors as $floor ) {

    $total_app = count( $floor);
    $colSpan = $maxCol%$total_app;

    echo "<tr>";

     for($i = 0;$i < $total_app; $i++){
      echo "<td colspan=" .(($i==($total_app-1))?$colSpan+1:1).  ">";
          echo $floor[$i] . ' ( ' . $total_app . ' ) '; //brackets only for debug
           echo "</td>";
     }

    echo  "</tr>";

}   


echo "</table>";