0

我使用以下内容从 PHP 中的关联数组打印一个 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

4 回答 4

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>
于 2013-03-24T04:50:03.973 回答
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 列键/值对。

于 2013-03-24T04:31:00.527 回答
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>
于 2013-03-24T04:32:17.167 回答
1

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

http://davidwalsh.name/css-columns

但是,这不是一件非常“编程”的事情。

您不必按顺序遍历数组可能会有所帮助。

如果你看看你有什么,索引有一个模式:

我 + 0x,我 + 1x,我 + 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)]);
}

或者类似的东西......这不是我的想法,我认为它有一些问题,但你应该能够将它打造成有效的东西。

于 2013-03-24T04:38:26.410 回答