优化显示结构的循环逻辑

optimize loop logic for displaying structure

我想每行订购 3 篇文章,而每隔一行一篇文章显示一个宽图像,以填充三个位置中的两个位置。 这是我想出的代码,但对于 "easy" 的东西来说似乎非常复杂。示例输出在底部。

也许有人知道可以做同样但更简单的事情。

谢谢!

<?php
    $i = 0;
    $x = 0;
    $first = false;
    $three = false;
    $five = true;
    foreach( range( 0, 27 ) as $k ) {
        if( $x != 0 && $x % 3 == 0 ) {
            echo "\n";
        }
        $x++;
        $i++;
        if( !$first && $i == 5 ) {
            $i = 0;
            $x++;
            $first = true;
            echo '[__]';
        }
        elseif( $first && !$three && $i == 4 ) {
            $i = 0;
            $x++;
            $three = true;
            $five = false;
            echo '[__]';
        }
        elseif( $first && !$five && $i == 6 ) {
            $i = 0;
            $x++;
            $three = false;
            $five = true;
            echo '[__]';
        }
        else echo '[]';
    }
?>

输出:

[][][]
[][__]
[][][]
[__][]
[][][]
[][__]
[][][]
[__][]
[][][]
[][__]
[][][]

假设您有 27 篇文章

$articles = 27 / 3;

我有这种方法,希望对你有用已更新

<?php
    $x = false;
    for ($i = 0; $i < $articles; $i++) {
        for($j = 0;$j < 3;$j++) {
            if ($i % 2 == 0) {
                if ($x && $j % 2 == 0) {
                    echo '[ ] ';
                } else {
                    echo '[ _ ] ';
                    $x = !$x;
                    $j++;
                }
            } else {
                echo '[ ]';
            }
        }
        echo '<br />';
    }
?>

这是我的结果

更新 1

只需将第一个循环更改为

$i=1 

所以它不能 mod 2 所以你得到了前三个,然后改变

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

这样才对

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

示例

<?php
    $count = 7;
    $articles = ceil($count / 3);
    $articles = $articles + ceil(ceil($articles/2) / 3);
    $x = false;
    for ($i = 1; $i <= $articles; $i++) {
        if ($count == 0) break;
        for($j = 0;$j < 3;$j++) {
            if ($count == 0) break;
            if ($i % 2 == 0) {
                if (!$x && $j % 2 == 0) {
                    echo '[ ] ';
                } else {
                    echo '[ _ ] ';
                    $x = !$x;
                    $j++;
                }
            } else {
                echo '[ ]';
            }
            $count--;
        }
        echo '<br />';
    }
?>

图像结果

万一有人需要它作为 twig 实现:

{% import _self as macros %}
{% set rows = ( items|length / 3 ) %}
{% set x = false %}
{% set y = 0 %}

{% for i in 1..rows+2 %}
    {% set skip = false %}
    {% for j in 0..2 %}
        {% if skip %}
            {% set skip = false %}
        {% else %}
            {% if i is divisible by(2) %}
                {% if x == false and j is divisible by(2) %}
                    {{ macros.item( items[y] ) }}
                    {% set y = y + 1 %}
                {% else %}
                    {{ macros.item( items[y], true ) }}
                    {% set y = y + 1 %}
                    {% set skip = true %}
                    {% if x == false  %}
                        {% set x = true %}
                    {% else %}
                        {% set x = false %}
                    {% endif %}
                {% endif %}
            {% else %}
                {{ macros.item( items[y] ) }}
                {% set y = y + 1 %}
            {% endif %}
        {% endif %}
    {% endfor %}
    <div class="clearfix"></div>
{% endfor %}

macro = bootstrap 块元素,如果设置为 true col 宽度从 4 到 8 以覆盖两个点 - 必须实现一个 skip 变量,因为在 twig 中你不能编辑循环索引 - 添加额外的独立计数器来遍历文章数组,行+2基于/3,每页总共33篇文章。