Есть ли простой способ сделать 4 за раз в цикле php foreach - PullRequest
1 голос
/ 14 августа 2011

У меня есть этот цикл php foreach

<?php $all_news = $this->db->query("Select * from news"); ?>
<div class="inner">             
foreach($all_news as $key=>$news){?>
  <div class="news <?php echo ($key%2==1)? 'odd': 'even'?>">
  <div class="news_img">....<?php echo $news['title'] ?>

Но проблема в том, что $ all_news может иметь около 20 результатов или около того, но дизайн позволяет мне размещать только 4 блока новостей в каждом внутреннем блоке ... есть ли способ сделать так, чтобы у меня было только 4 блока новостей в каждый внутренний div

Ответы [ 4 ]

6 голосов
/ 14 августа 2011
<?php 

$all_news = $this->db->query("Select * from news"); 

echo '<div class="inner">';

$c = count($all_news);
for($i = 0; $i < $c; $i++){
    <div class="news <?php echo ($i%2==1)? 'odd': 'even'?>">
    <div class="news_img">....<?php echo $news['title'] ?>
    if($i % 4 == 3)
        echo '</div><div class="inner">';
}

echo '</div>';

?>
4 голосов
/ 14 августа 2011

Измените ваш запрос, чтобы он возвращал только 4 строки:

SELECT * FROM news LIMIT 4

В качестве альтернативы вы можете изменить цикл for.

for($i = 0; $i < min(4, count($all_news)); $i++)
{?>
  <div class="news <?php echo ($i%2==1)? 'odd': 'even'?>">
  <div class="news_img">....<?php echo $all_news[$i]['title'];

<?}

[edit]

Посмотрите, что вы имеете в виду сейчас.Создайте две петли:

<?
$index = 0;
while ($index < count($all_news))
{
  $news = $all_news[$index];

  ?>Start outer div<?

  for ($item = 0; $item < 5; $item++)
  {
    ?>Inner div with news item <? echo $news['title'];
  }

  ?>End outer div<?
  $index++;
}
1 голос
/ 14 августа 2011

Самый ленивый способ - просто проверить, сделали ли вы уже четыре в текущем div на лету.Если у вас есть, закройте текущий div и начните новый:

<div class="inner">
<?php
foreach ($all_news as $key => $news) {
    if ($key % 2) {
        $oddEven = 'odd';
    } else {
        $oddEven = 'even';
        if ($key && $key % 4 === 0) {
            echo '</div><div class="inner">';
        }
    }

    echo "<div class=\"news $oddEven\">";
    // ...
}
?>
</div>

Обратите внимание, что это предполагает, что $all_news имеет элемент в 0, поэтому он гарантирует, что он не закрывает первый, пустой div.

1 голос
/ 14 августа 2011

Вы можете использовать два for цикла:

<?php $all_news = $this->db->query("Select * from news"); ?>
<?php for($i = 0, $l = count($all_news); $i < $l; $i+=4): ?>
    <div class="inner">
    <?php for($j = $i; $j < $i+4; $j++): ?>
        <div class="news <?php echo ($j%2==1)? 'odd': 'even'?>">
        <div class="news_img">....<?php echo $all_news[$j]['title'] ?>
    <?php endfor;?>
    </div>
<?php endfor;?>

Другой вариант будет array_chunk [документы] .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...