每2条记录后打开关闭<ul>?</ul>

时间:2013-03-19 18:17:04

标签: php

我有这段代码:

 for ($i = 0; $i < count($listings); $i++)
    {
                if ($i != 0 && $i%2 == 0)
                   {
                      $endul .= $arr[$i] . '</ul> <hr /> <ul class="listing">';
                   }
                   else
                   {
                      $endul .= $arr[$i];
                   }

我正在尝试关闭后2条记录,然后重新打开接下来的2条记录等等......到目前为止,似乎代码正在“有点”正常工作但它取得前3条记录然后关闭UL而不仅仅是前2?

6 个答案:

答案 0 :(得分:2)

这是我的第一篇StackOverflow帖子,请耐心等待:):

问题出在这里:

if ($i != 0 && $i%2 == 0)

如果你在循环中追踪$ i的值,你会得到以下结果:

$i = 0 ==> false
$i = 1 ==> false
$i = 2 ==> true
$i = 3 ==> false
$i = 4 ==> true

所以打印出来

    $arr[0] .
    $arr[1] .
    $arr[2] . '</ul> <hr /> <ul class="listing">' .
    $arr[3] .
    $arr[4] . '</ul> <hr /> <ul class="listing">'

为了解决这个问题,您需要更改if条件

if ($i%1 == 1)

希望这有帮助!

答案 1 :(得分:1)

您可以先尝试将它们分组为

$group = 2;
$listings = range("A", "Z");

foreach ( array_chunk($listings, 2) as $set ) {
    printf('<ul class="listing">%s</ul>', implode(array_map(function ($v) {
        return sprintf('<li>%s</li>', $v);
    }, $set)));
}

foreach ( array_chunk($listings, 2) as $set ) {
    printf('<ul class="listing">');
    foreach ( $set as $v ) {
        printf('<li>%s</li>', $v);
    }
    printf('</ul>');
}

你会得到相同的结果

<ul class="listing">
    <li>A</li>
    <li>B</li>
</ul>
<ul class="listing">
    <li>C</li>
    <li>D</li>
</ul>
<ul class="listing">
    <li>E</li>
    <li>F</li>
</ul>
<ul class="listing">
    <li>G</li>
    <li>H</li>
</ul>
<ul class="listing">
    <li>I</li>
    <li>J</li>
</ul>

 ....... 

答案 2 :(得分:0)

嗯,0是第一条记录,你的if语句特别排除了它。所以它不会在第三个记录之后关闭,即$ i = 2。

示例:

for ($i = 1; $i < 10; $i++) {
    if ($i % 2 == 0) {
        echo '</ul>';
    }
}

这对我来说很好。

答案 3 :(得分:0)

更改此行:

$endul .= $arr[$i] . '</ul> <hr /> <ul class="listing">';

对此:

$endul .= '</ul> <hr /> <ul class="listing">'.$arr[$i];

答案 4 :(得分:0)

这是Perl还是PHP,对吗?也许将来用这些语言标记它?无论如何,我怀疑你的问题是你的数组以零索引开头。

我在推测,但我们假设您的@arr数组包含带有HTML标记的元素

<li>whatever</li>

订单项。

让我们计算你的元素:

元素0 - 我通过测试吗?否:添加第一个订单项,但不要添加关闭,规则和打开。

元素1 - 我通过测试吗?否:添加第二个订单项,但不要添加关闭,规则和打开。

元素2 - 我通过测试吗?是:添加第三个订单项,然后添加关闭,规则并打开。

元素3 - 我通过测试吗?否:添加新的第一个订单项,但不要添加关闭,规则和打开。

元素4 - 我通过测试吗?是:添加新的第二个订单项,然后添加关闭,规则并打开。

元素5 - 您知道模式:我们在关闭前重复两个订单项的组。

因为这段代码从零开始,所以我们在第一组项目中有零和两个额外的案例。

索引的模数可以测试奇数而不是偶数:

if ($i%2 == 1)

我认为测试会按照你想要的方式构建格式,你可以在每个奇数元素之后添加“记录关闭”标记。我假设您必须在循环外部使用逻辑来进行最终的关闭标记。当然,在最终元素为奇数的情况下,你仍然会有一个额外的空的无序列表容器,但是可能会添加一些东西吗?

答案 5 :(得分:0)

这是最好的方法:

    $rows = range(1,10);
        $i=1;
        echo "<ul>";
        foreach($rows as $key=>$row)
        {
            echo "<li>$row</li>";
            if($i%2==0)
            {
              echo "</ul><ul>"; 
            }
            $i++;
        }
       echo "</ul>";