打印一个表,两列PHP关联数组作为三个并排的双列表

时间:2013-03-24 04:09:51

标签: php containers html html-table

我使用以下内容从PHP中的关联arrray打印15行双列表:

<table id="freq-table" class="table-list" cellspacing="0" cellpadding="10">
<tbody>
    <?
    $rowCount = 0;
    foreach($word_frequency as $word => $frequency) if ($rowCount++ < 15) {?>
        <tr>
            <td><? echo $word; ?></td>
            <td<? echo $frequency; ?></td>
        </tr>
    <?}?>
</tbody>
</table>

它工作正常,但在页面上占用了太多的垂直空间。如何将其格式化为三个并排的五行和两列表,第一组包含数组1-5,第二组包含6-10,最后一组包含11-15? (参考下图):

key1  value1  |  key6   value6   |  key11   value11
key2  value2  |  key7   value7   |  key12   value12
...
...
key5  value5  |  key10  value10  |  key15   value15 

我尝试了各种表,div,容器和多循环实验,结果非常复杂(且不合适)。提前谢谢。

4 个答案:

答案 0 :(得分:2)

由于您还可以使用多个列来实现此视觉效果,因此您可能希望提前格式化数据,以使生成表的代码更加清晰。

<?php
  // Format the array data so each row contains all of the columns needed
  $rows = array();
  $max_per_column = 5;
  $max_words = 15;
  $rows = array_pad($rows, $max_per_column, array());
  $count = 0;
  foreach ($word_frequency as $word => $frequency) {
    if ($count >= $max_words) {
      break;
    }
    array_push($rows[$count % $max_per_column], $word, $frequency);
    $count++;
  }
?>
<table id="freq-table" class="table-list" cellspacing="0" cellpadding="10">
  <tbody>
    <?php
      foreach ($rows as $cols) {
        echo '<tr><td>' . implode('</td><td>', $cols) . '</td></tr>';
      }
    ?>
  </tbody>
</table>

答案 1 :(得分:1)

执行此操作的唯一方法是使用数字键。例如

 $word_frequency[0] = array();
 $word_frequency[0]['word'] = "some word";
 $word_frequency[0]['frequency'] = 10;
 ...
 $word_frequency[15] = array();
 $word_frequency[15]['word'] = "some other word";
 $word_frequency[15]['frequency'] = 14;

获得阵列后,可以按如下方式重复循环

<table id="freq-table" class="table-list" cellspacing="0" cellpadding="10">
  <tbody>
<?
$rowCount = 0;
 for($i = 0; $i <= 5; $i++) { 
    $word[0] = $word_frequency[$i]["word"];
    $frequency[0] = $word_frequency[$i]["frequency"];
    $word[1] = $word_frequency[$i + 5]["word"];
    $frequency[1] = $word_frequency[$i + 5]["frequency"];
    $word[2] = $word_frequency[$i + 10]["word"];
    $frequency[2] = $word_frequency[$i + 10]["frequency"];
    ?>
     <tr>
    <?
    for($x = 0; $x <= 2; $x++ ){
 ?>

        <td><? echo $word[$x]; ?></td>
        <td<? echo $frequency[$x]; ?></td>

    <?
    }
    ?>
     </tr>

    <?
  }
    ?>
 </tbody>
 </table>

每个$ i循环创建行,而$ x循环创建列。当然,这假定您至少有15个项目,您将仅创建5行和3列键/值对。

答案 2 :(得分:1)

尝试类似的东西。

<table width="100%">
<tr>
<?php
    $rowCount = 0;
    foreach($word_frequency as $word => $frequency) if ($rowCount < 15) { ?>
   <?php if($rowCount % 5 == 0) {  ?>
     <td><table border=1>
   <?php } ?>                   
       <tr>
         <td><?php echo $word; ?></td>
         <td><?php echo $frequency; ?></td>
       </tr>
       <?php if($rowCount % 5 == 4) {  ?>
     </table></td>
   <?php } ?>                   
<?php $rowCount++; } ?>
</tr>
</table>

答案 3 :(得分:1)

好吧,如果我这样做,我可能会使用带有css列的ul:D

http://davidwalsh.name/css-columns

但是,这不是一个非常“程序化”的事情。

您可以不必按顺序浏览数组。

如果你看一下你所拥有的东西,就会有一个指数模式:

i + 0x,i + 1x,i + 2x,...

其中x是您的项目数除以列数。

并且当i = total / x

时你停止迭代

很抱歉太累了,不能为你编码,但要点是:

$myarray = [1 ... 15];
$columns = 3;

$arrayKeys = array_keys($myarray);
$total = count($array);
$x = floor $total  / $column;

for ($i = 0; $i > $x; $i += $x + 1 ){
  echo $arrayKeys[$i] . " - " . $myarray($arrayKeys[$i]);
  echo $arrayKeys[$i + $x] . " - " . $myarray($arrayKeys[$i + $x]);
  echo $arrayKeys[$i + ($x * 2) ] . " - " . $myarray($arrayKeys[$i + ($x * 2)]);
}

或类似的东西...这是我的头脑,我认为它有一些问题,但你应该能够把它击败成有效的东西。