【问题标题】:optimize loop logic for displaying structure优化显示结构的循环逻辑
【发布时间】:2015-12-24 22:32:43
【问题描述】:

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

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

谢谢!

<?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、$first、$3、$5?
  • 变量在 3 和 5 个项目之间切换。 27 只是范围的一个数字。您可以创建 500 而不是 27,检查输出示例 - 想象每个框都是图像,小图像与宽图像
  • 我不明白你的问题。您是在寻找所有可能的组合还是什么?如果您获得包含这些图像的文章列表 - 我在您的代码中看不到原始数组。
  • 他需要用更简单的方法得到那个形状
  • foreach ([1, 1, 1, 0, 1, 3, 0, 1, 1, 1, 0, 3, 1, 0] as $size) { echo $size ? '[' . str_repeat('_', $size - 1) . ']' : "\n"; }

标签: php logic structure formula


【解决方案1】:

假设您有 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 

所以它不能修改 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 />';
    }
?>

图像结果

【讨论】:

  • 现在这是诀窍,第一行需要是 3,然后是 1,然后是宽,就像我的示例一样 - 这就是糟糕的部分。它是 4,然后是前 3,然后旋转 5 和 3:D - 但是是的,您的解决方案已经好得多了
  • @Tobias,哦,对不起,没问题,请看我的更新
  • 太棒了!非常非常好地压缩这个:D 非常感谢!
【解决方案2】:

如果有人需要它作为 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 以覆盖两个点 - 必须实现一个跳过变量,因为在 twig 中你不能编辑循环索引 - 添加了额外的独立计数器来通过文章数组,rows+2 基于 / 3,每页共有 33 篇文章。

【讨论】:

    猜你喜欢
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多