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

I use the following to print a 15-row, two-column table from an associative arrray in PHP:

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

It works fine but takes up too much vertical space on the page. How can I format this into three side-by-side tables of five rows and two columns each with the first group having array items 1-5, the second group 6-10, and the last group 11-15? (refer to following illustration):

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

I've tried various table, div, container, and multiple loop experiments with very mixed (and unsuitable) results. Thank you in advance.

Try some thing like that.

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

The only way to do this is to use a numeric key. For example

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

Once you have your array, you could repeat the loop as follows

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

Every $i loop creates the row, while the $x loop creates the columns. This assumes, of course, that you have at least 15 items, that you're going to create only 5 rows and three columns of key/value pairs.

Well, if I were doing it, I'd probably use a ul with a css columns :D

http://davidwalsh.name/css-columns

However, that's not a very "programmerly" thing to do.

It might help that you don't have to go through the array in order.

If you look at what you have, there is a pattern to the indices:

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

Where x is your number of items divided by the number of columns.

and you stop iterating when i = total / x

Sorry to be too tired to code this for you but the gist is this:

$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)]);
}

Or something like that... that's off the top of my head and I think it has some issues, but you should be able to beat that into something that works.

Since you can also use multiple columns to achieve this visual effect, you're going to probably want to format the data ahead of time to make the code of generating the table a little cleaner.

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