使用 PHP 将类添加到 li,然后在每三项之后交替


using php to add classes to li then alternate after every third item?

这可能

非常简单,但我正在尝试找出一种方法将类添加到无序列表中,然后在每三项之后交替该类。

只在每三项上添加一个类(这不是我想要的),但这是我的代码:

<?php $i=1; foreach($this->items as $item) : ?>
      <li class="<?php if ($i % 3 == 0) : ?>odd<?php endif; ?>"><a href="<?php echo $linky; ?>">xxx</a></li>
<?php $i++; endforeach; ?>

哪个吐出:

<li class="">xxx</li>
<li class="">xxx</li>
<li class="odd">xxx</li>
<li class="">xxx</li>
<li class="">xxx</li>
<li class="odd">xxx</li>

但我希望得到的是:

<li class="odd">xxx</li>
<li class="odd">xxx</li>
<li class="odd">xxx</li>
<li class="even">xxx</li>
<li class="even">xxx</li>
<li class="even">xxx</li>

等等..通常我会使用 jquery 来做这样的事情,但在这种情况下我必须使用 php。任何帮助将不胜感激:)

每次$i % 3 == 0时都翻转(否定)的布尔标志:

// Start with 0 instead of 1
$i=0;
// Flag starts TRUE
$state = TRUE;
foreach ($this->items as $item) {
  if ($i % 3 === 0) {
    // Flip to opposite state
    $state = !$state;
  }
  ?>
  <li class="<?php if ($state) : ?>odd<?php else: ?>even<?php endif; ?>"><a href="<?php echo $linky; ?>">xxx</a></li> 
  <?php
  $i++;
}

这是一个演示。尽管您需要检查输出才能看到类更改。

您使用了错误的运算符。

if ($i % 3 == 0)

表示"如果$i的余数除以 3 为 0"。

你想要的是

if (floor($i/3) == 0).

试一试,看看进展如何。

编辑:您似乎也缺少"else"代码。如果你没有这个,它就不会为非"奇数"类写"偶数"。

编辑

编辑:如果您希望模式继续,请使用:

if ((floor($i/3) % 2) == 0).

我假设您希望第 7 项是"奇数"?我写了JavaScript,但应该很容易转换为PHP

演示

for (var i = 0; ​i < 15; i++) {
    if(i%6 < 3) {
document.write("odd<br>");
    }
    else {
document.write("even<br>")     
    }        
}​

将代码更改为:

<?php $i=0; foreach($this->items as $item) : ?>
      <li class="<?php if ($i % 6 < 3) : ?>odd<?php else: ?>even<?php endif; ?>"><a href="<?php echo $linky; ?>">xxx</a></li>
<?php $i++; endforeach; ?>

另一种方法是使用新的 CSS3 选择器,允许您定位奇数和偶数子项。

下面是一个示例的链接。 基本上,您的列表就像往常一样。

<ul>
<li></li>
<li></li>
</ul>

然后,与其有一个名为 odd 的类,甚至具有不同的样式,不如使用这样的新选择器......

li:nth-child(even) { background: #fff; }
li:nth-child(odd) { background:#000; }

这将使所有偶数列表项的背景为 #fff,所有奇数列表项的背景为 #000。

编辑:您可以使用其他几个 CSS3 选择器,仅使用第一个孩子和第二个孩子来定位前两个之后的偶数和赔率。

您只打印循环的每三次迭代的原因是您使用模运算符"%"来测试 i 是否可以被三个($i % 3 == 0)整除。 这导致仅在$i能被 3 整除时才打印。

要解决您的问题:

<?php
$odd = "<li class='odd'>";
$even = "<li class='even'>";
$i = 0;
foreach($this->items as $item)
{
  if($i < 3)
    echo $odd . $item . "</li>";
  else if($i >= 3)
    echo $even . $item . "</li>";
  $i++;
  if($i > 5)
    $i = 0;
}
?>

请注意,由于 $i 从 0 开始,因此前 3 项的索引为 0 - 2,随后的 3 项将索引为 3 - 5。

尝试在

for 循环中为每个循环嵌套 a。外循环告诉迭代多少次,内循环告诉奇数和偶数多少次。