【问题标题】:Print one table, two-column PHP associative array as three side-by-side, two-column tables将一个表格、两列 PHP 关联数组打印为三个并排、两列的表格
【发布时间】:2013-03-24 04:09:51
【问题描述】:

我使用以下内容从 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、容器和多循环实验,结果非常混杂(且不合适)。提前谢谢你。

【问题讨论】:

  • 你需要使用多个表吗?更多列呢?
  • 更多列应该可以工作。我正在努力解决如何增加和识别三组的每一行/列中的内容的循环逻辑。感谢您的及时回复,Aiias。 :)

标签: php containers html html-table


【解决方案1】:

由于您也可以使用多列来实现这种视觉效果,因此您可能需要提前格式化数据以使生成表格的代码更简洁。

<?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>

【讨论】:

  • Aiias,我喜欢你的预格式化想法。我用这段代码试过了,它把所有东西都放在一行上——而且代码不“知道”到 15 个项目停止......想法?
  • @Andreas3204 - 我不知道你只想要 15 个项目,但开始时还有更多:)。我在答案中添加了可配置数量的单词(目前为 15 个)。哎呀!忘记增加计数器:D.
  • Aiias,这是一个绝妙的解决方案。您添加的计数器足够灵活,可以让我在从台式机移植到较小的移动显示器时使用它。非常感谢你。非常好的工作。 :)
【解决方案2】:

试试类似的东西。

<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>

【讨论】:

  • kuldeep,这在第一次通过复制和粘贴时有效。惊人的。您使用: if($rowCount % 5 == 4) 非常聪明。非常感谢你。 :)
【解决方案3】:

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

 $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 列键/值对。

【讨论】:

  • 罗伯特,感谢您的及时回复。感谢您抽出额外的时间来解释逻辑。使用您的版本,每次通过循环时,我都会得到“未定义的偏移量:0”、“未定义的偏移量:5”、“未定义的偏移量:15”等。 (传入的数组大于 15 个项目,但我只想显示前 15 个。这可能是个问题吗?)
  • 听起来您还没有在数组上创建数字索引。相反,您可能仍在使用关联数组。
  • 是的[正如我的问题中所发布的],它是一个关联数组。在重新阅读您的答案时,很明显:您的代码解决方案与带有数字键的数组有关。我错过了。我已经为你的代码添加了书签,因为我实际上在接下来的几天里会用到它。再次感谢,罗伯特。 :)
【解决方案4】:

好吧,如果我这样做,我可能会使用带有 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)]);
}

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

【讨论】:

  • 约翰,感谢您的时间、考虑和解释。我从今天失败的尝试中学到了很多东西——但远不如我从阅读答案中学到的多。这对帮助我做这件事有很长很长的路要走。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 2012-10-21
  • 1970-01-01
  • 2014-01-27
相关资源
最近更新 更多