2013-03-24 4 views
0

Я использую следующие для печати 15 строк, таблицу из двух столбцов из ассоциативного arrray в РНР:печати одной таблицы, две колонки 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> 

Он отлично работает, но занимает слишком много места на странице. Как я могу отформатировать это в три таблицы бок о бок из пяти строк и по два столбца с первой группой, имеющей элементы массива 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, контейнер, и множество эксперименты петли с очень смешанными (и непригодными) результатами. Заранее спасибо.

+1

Нужно ли использовать несколько таблиц? Как насчет большего количества столбцов? – Aiias

+0

Больше столбцов должно работать. Я борюсь с логикой цикла в том, как увеличивать и определять, что происходит в каждой строке/столбце из трех групп. Спасибо за ваш быстрый ответ, Aiias.:) – Andreas3204

ответ

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

kuldeep, это сработало на первом проходе с копией и вставкой. Удивительно. Ваше использование: if ($ rowCount% 5 == 4) очень умно. Большое спасибо. :) – Andreas3204

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> 

Каждый $ я цикл создает строку, в то время как $ х цикл создает столбцы. Это предполагает, конечно, что у вас есть как минимум 15 элементов, которые вы собираетесь создать только 5 строк и три столбца пары ключ/значение.

+0

Робберт, спасибо за ваш быстрый ответ. Спасибо, что потратили дополнительное время, чтобы объяснить логику. С вашей версией я получаю «Undefined offset: 0», «Undefined offset: 5», «Undefined offset: 15» и т. Д. Для каждого прохождения через петли. (Входящий массив больше, чем 15 элементов, но я ищу только для отображения первого 15. Может быть, это проблема?) – Andreas3204

+0

Похоже, что вы не создали числовой индекс в своем массиве. Вместо этого вы все равно можете использовать ассоциативный массив. – Robbert

+0

Да [как опубликовано в моем вопросе] это ассоциативный массив. Повторно прочитав ваш ответ, это ясно: ваше решение кода относится к массивам с числовыми ключами. Я пропустил это. Я добавил в закладки код bcoz, который я использую в ближайшие дни. Еще раз спасибо, Робберт. :) – Andreas3204

1

Ну, если бы я делал это, я бы, вероятно, использовать ул с CSS столбцами: D

http://davidwalsh.name/css-columns

Однако, это не очень «programmerly», что нужно сделать.

Это может помочь вам не пройти через массив по порядку.

Если вы посмотрите на то, что у вас есть, есть образец для индексов:

я + 0x, я + 1x, я + 2x, ...

Где х ваше количество элементов делится на количество столбцов.

и вы перестанете итерации, когда я = общее/х

К сожалению, слишком устал, чтобы закодировать это для вас, но суть заключается в следующем:

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

Или что-то подобное ... это от в верхней части головы, и я думаю, что у нее есть некоторые проблемы, но вы должны быть в состоянии победить это во что-то, что работает.

+0

Джон, спасибо за ваше время, внимание и объяснение. Я многому научился с моими неудачными попытками сегодня - но не так сильно, как я научился читать ответы. Это долгий и длинный путь, чтобы помочь мне сделать это правильно. Еще раз спасибо. – Andreas3204

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

Aiias, мне нравится ваша идея перед форматированием. Я попробовал это, хотя с помощью этого кода, и он помещал все в одну строку - и код не «знал», чтобы остановиться на 15 элементах ... Мысли? – Andreas3204

+0

@ Andreas3204 - Я не знал, что вам нужно всего 15 предметов, но с этим больше, чем для начала :). На мой ответ я добавил настраиваемое количество слов (15 на данный момент). К сожалению! Забыл увеличить счетчик: D. – Aiias

+1

Aiias, это блестящее решение. Ваше добавление счетчиков достаточно гибкое, что позволит мне использовать это в будущем при портировании с рабочего стола на более мелкие мобильные дисплеи. Благодарю вас, любезно. Очень приятная работа. :) – Andreas3204

Смежные вопросы