1

我有这个代码:

 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个?

4

6 回答 6

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)

希望这可以帮助!

于 2013-03-19T18:43:47.167 回答
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>

 ....... 
于 2013-03-19T18:41:52.567 回答
0

好吧,0 是第一条记录,而您的 if 语句专门排除了它。所以它直到第三条记录之后才会关闭,即 $i = 2。

例子:

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

这对我来说很好。

于 2013-03-19T18:20:34.717 回答
0

更改此行:

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

对此:

$endul .= '</ul> <hr /> <ul class="listing">'.$arr[$i];
于 2013-03-19T18:21:29.543 回答
0

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

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

<li>whatever</li>

行项目。

让我们数一数你的元素:

元素 0 - 我是否通过了测试?否:添加第一个行项目,但不添加关闭、规则和打开。

要素 1 - 我能通过考试吗?否:添加第二个行项目,但不要添加关闭、规则和打开。

要素 2 - 我能通过考试吗?是:添加第三行项目,然后添加关闭、规则和打开。

要素 3 - 我能通过考试吗?否:添加新的第一个行项目,但不添加关闭、规则和打开。

要素 4 - 我是否通过了考试?是:添加新的第二行项目,然后添加关闭、规则和打开。

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

因为此代码以零开头,所以我们在第一组项目中有零和两个的额外情况。

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

if ($i%2 == 1)

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

于 2013-03-19T18:41:49.770 回答
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>";
于 2018-08-16T18:44:32.263 回答