0

我有一个相当长的代码,所以我认为最好的办法是在这里发布一些附加评论作为其中的问题:

<div class="contentRow">

    <h2>Title</h2>

    <div id="frame">

        <?php

        //Get files
        $sql->query("SELECT * FROM files WHERE job = 'true'");
        $count  = count($sql->get());

        //No files to display
        if ($count == "0"){

            echo "<div class='box red'><p>No jobs found.</p></div>";

        } else{

            $sql->query("SELECT * FROM files WHERE job = 'true'");

            $i=0;

            foreach($sql->get() as $result){

                $i++;

        ?>

        <!-- Here I start printing the results and here the problems begin -->



        <!-- My goal here: Print n .jobsContainer with exactly 4 .jobContainer inside -->
        <?php if ($i % 4 == 0){ ?>
        </div><!-- CLOSE jobsContainer -->
        <?php } ?>

        <?php if ($i % 4 == 0 OR $i == 1){ ?>
        <div class="jobsContainer"><!-- OPEN jobsContainer -->
        <?php } ?>


            <!-- Print the .jobContainer -->
            <div class="jobContainer">
                content + table + form
            </div>

            <!-- My goal here: Print .jobSeperator after every 2nd  .jobContainer -->
            <?php if ($i % 2 == 0){ ?>
            <div class="jobSeperator">&nbsp;</div>
            <?php } ?>


        <!-- CLOSE loop -->
        <?php  } }?>


    </div><!-- jobsFrame -->

    <div class="clear"></div>

</div><!-- contentRow -->

所需的输出应如下所示:

在此处输入图像描述

我的问题如下:

似乎第一个容器中只包含3 个元素,但之后有 4 个。因此分隔符也有点混乱,看起来像这样:

在此处输入图像描述

似乎问题不适用于.jobSeperator,因为它总是在每 2 个容器之后包含,但是它也被搞砸了,因为在第一个.jobsContainer容器中只有 3 个子容器。

我不明白为什么一开始.jobsContainer只有 3 个子容器,但是从那以后,根据需要,有 4 个,但可能很明显,我只是看不到它......

ps 如果我将代码设置为.jobContainer在一个内打印 5 .jobsContainer,则第一个打印 4 ,.jobsContainer然后在每个后续打印 5.jobsContainer

4

4 回答 4

1

尝试更改这些行:

    <?php if ($i % 4 == 0 OR $i == 1){ ?>
         <div class="jobsContainer"><!-- OPEN jobsContainer -->
    <?php } ?>

    <?php if ( ($i-1) % 4 == 0 ){ ?>
         <div class="jobsContainer"><!-- OPEN jobsContainer -->
    <?php } ?>

现在您在第 1、第 4、第 8、第 12、... 迭代开始时打开容器,在此更改之后,您应该在第 1、第 5、第 9、第 13...迭代之前打开容器,这应该可以解决问题。你会摆脱丑陋的或。看来这是唯一的错误,请尝试一下。

我还建议分离应用程序逻辑和表示。

于 2012-05-29T09:53:03.917 回答
1

首先,您不应该将您的 SQL 逻辑与 HTML 混合在一起。

反正。这个想法是您需要在每个第二项之后输出一个分隔符。我会看的测试用例是这样的。

1 2
---
3 4
***
5 6
---
7

编写它的代码是:

$i = 0;
foreach( /* some array */ as $data ){

    $i++;
    if ( ($i - 1) % 2 === 0 ){

        if ( ($i - 1) % 4 === 0 ){

            echo '<br />***<br />';
        } else {

            echo '<br />---<br />';
        }            
    }

    echo $i, ' ';
}

这将重现上述结构(从未测试过)。

至于布局和其余应用逻辑的分离,你可以看看这篇文章。它将显示一个非常简单的方法,不需要额外的 3rd 方库。

于 2012-05-29T09:37:01.770 回答
0

我相信你犯了一个小错误。

<!-- My goal here: Print n .jobsContainer with exactly 4 .jobContainer inside -->
<?php if ( ($i+1) % 4 == 0){ ?>
</div><!-- CLOSE jobsContainer -->
<?php } ?>
<?php if ( ($i+1) % 4 == 0 OR $i == 1){ ?>
<div class="jobsContainer"><!-- OPEN jobsContainer -->
<?php } ?>

在此位中使用($i+1)而不是。$i

于 2012-05-29T09:52:50.673 回答
0

如果您检查生成的 HTML 输出,您会看到当 $i == 4 时,您首先关闭 jobsContainer div,然后再输出第 4 个 jobContainer。您需要将输出顺序更改为如下所示:

编辑:似乎您应该拆分第一个 jobsContainer 的开始($i == 1)

<div class="contentRow">
    <h2>Title</h2>
    <div id="frame">
        <?php
        $i = 0;
        for($j = 0; $j < 12; $j++)
        {
            $i++;
            ?>
            <?php if ($i == 1) { ?>
                <div class="jobsContainer">
            <?php } ?>

            <div class="jobContainer">job</div>

            <?php if ($i % 4 == 2) { ?>
                <div class="jobSeperator">&nbsp;</div>
            <?php } ?>

            <?php if ($i % 4 == 0) { ?>
                </div>
                <div class="jobsContainer">
            <?php } ?>

            <?php 
        }
        ?>
        <?php if ($i > 0) { ?>
            </div>
        <?php } ?>
    </div>

    <div class="clear"></div>
</div>
于 2012-05-29T09:58:37.740 回答