3

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

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

<?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.. 任何帮助将不胜感激:)

4

6 回答 6

6

使用每次翻转(否定)的布尔标志$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++;
}

这是一个演示。尽管您需要检查输出以查看类的变化。

于 2012-06-29T00:39:52.757 回答
2

您使用了错误的运算符。

if ($i % 3 == 0)

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

你想要的是

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

试一试,看看效果如何。

编辑:您似乎也缺少“其他”代码。如果你没有那个,它不会为非“奇数”类写“偶数”。

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

if ((floor($i/3) % 2) == 0).
于 2012-06-29T00:39:51.457 回答
2

我假设您希望第 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; ?>
于 2012-06-29T00:42:23.167 回答
1

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

这是一个带有示例的链接。基本上,你会像往常一样拥有你的清单。

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

然后,您可以使用像这样的新选择器,而不是拥有一个名为奇数甚至不同样式的类...

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

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

编辑:您可以使用其他几个 CSS3 选择器仅在前两个使用 1st-child 和 2nd-child 之后定位偶数和赔率。

于 2012-06-29T01:30:15.160 回答
0

尝试在 for 循环中嵌套 for each 循环。外部循环告诉迭代多少次,内部循环告诉放置奇数和偶数多少次。

于 2012-06-29T00:40:08.413 回答
0

您只打印循环的每三次迭代的原因是您正在使用模数运算符"%"来测试 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。

于 2012-06-29T00:44:46.823 回答