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つの要素が含まれています。したがって、セパレータも少し混乱していて、次のようになります。

ここに画像の説明を入力してください

には問題が当てはまらないようです。これは、.jobSeperator2つおきのコンテナの後に必ず含まれるためですが、最初の.jobsContainerサブコンテナは3つしかないため、混乱します。

最初はサブコンテナが3つしかない理由.jobsContainerがわかりませんが、それ以降は必要に応じて4つありますが、おそらくそれは明らかで、私はそれを見ることができません...

ps .jobContainer1つ.jobsContainerの中に5を印刷するようにコードを設定した場合、最初.jobsContainerに4が印刷され、次のすべての5から5が印刷されます。.jobsContainer

4

4 に答える 4

1

まず第一に、SQLロジックをHTMLと混合したままにしないでください。

ともかく。アイデアは、2番目の項目ごとにセパレータを出力する必要があるということです。私が見るテストケースはこのようになります。

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, ' ';
}

これにより、上記の構造が再現されます(テストされていません)。

レイアウトと残りのアプリケーションロジックの分離については、この記事を参照してください。追加のサードパーティライブラリを必要とせずに、非常に簡単な方法を示します。

于 2012-05-29T09:37:01.770 に答える
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 に答える
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の場合、4番目のjobContainerを出力する前に、最初にjobsContainerdivを閉じていることがわかります。出力の順序を次のように変更する必要があります。

編集:最初の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 に答える