【问题标题】:PHP Skip something a certain amout of times in loopPHP在循环中跳过某些东西一定次数
【发布时间】:2015-05-21 07:05:37
【问题描述】:

我有大量的for 循环用于生成表,结果来自我的 MySQL 数据库。一些更重要的信息是开始和结束日期。我计算除了开始日期之外还有多少天(例如 02.03.2015 - 04.03.2015,2 天)。我将这个结果保存在$difference,但是我在for循环中得到了这个结果,所以我不能简单地进入for循环并说$xyz - difference

所以我考虑跳过循环中的<td>'s,次数与差异一样多。

在图片中,您可以看到 <td> 的缺勤天数已超出。

我怎样才能跳过它们与差异一样多,所以表格看起来又正确了?

我的代码仍然一团糟,所以没有人对此:

echo '<table class="table table table-bordered table-striped table-hover">';
echo '<thead>';
for ($l = 0; $l < $days; $l++) {
    if ($l == 0) {
        echo '<th>', '<b>Day</b>', '</th>';
    } else {
        $date = "$current-$month-$l";
        $date = date('D', strtotime($date));
        $date = substr($date, 0, -1);
        echo '<th class="center">', $date,'</th>';
    }
    echo "\n";
}

echo '</thead>';
echo '<tbody>';

for ($l = 0; $l < $days; $l++) {
    if ($l == 0) {
        echo '<td>', '<b>Onshore</b>', '</td>';
    } else {
        echo '<th class="center">', $l, '</th>';
    }
    echo "\n";
}

for ($i = 0; $i < $count_user; $i++) {
    echo '<tr>';        
    $result = mysql_query("select start, end, type_FK, employee_FK FROM absences where employee_FK = {$array_user[$i]['employee_ID']} and MONTH(start) = $month and YEAR(start) = $current");
    while ($row = mysql_fetch_assoc($result)) {
        $array_absences[] = $row;
    }

    $count = 0;
    if (!empty($array_absences)) {
        $count = count($array_absences);
    }

    for ($j = 0; $j < $days; $j++) {
        $true = 0;
        if ($j == 0 && $i == $count_on) {
            echo '<td>';
            echo '<b>Offshore</b>';
            echo '</td>';
            for($k = 0; $k < $days -1; $k++){
                echo '<td>';
                echo '</td>';
            }
            echo '</tr>';
        }

        if ($j == 0) {
            echo '<td>';
            echo $array_user[$i]['name'], ' ', $array_user[$i]['surname'];
            echo '</td>';
        }

        for ($k = 0; $k < $count; $k++) {       
            $array_absences[$k]['start'] = substr($array_absences[$k]['start'], -2);
            $array_absences[$k]['end']   = substr($array_absences[$k]['end'], -2);
            $array_absences[$k]['start'] = ereg_replace("^0", "", $array_absences[$k]['start']);
            $array_absences[$k]['end']   = ereg_replace("^0", "", $array_absences[$k]['end']);      
            $difference = $array_absences[$k]['end'] - $array_absences[$k]['start'];    

            if ($j == $array_absences[$k]['start'] && $array_absences[$k]['employee_FK'] == $array_user[$i]['employee_ID']) {
                $true = 1;
                $result = mysql_query("select approved from absences where DAY(start) = $j and MONTH(start) = $month");
                while ($row = mysql_fetch_assoc($result)) {
                    $approved[] = $row;
                    $n++;
                }

                $now = date('Y-m-d');
                $absence = strtotime("$current/$month/$j");
                $absence = date('Y-m-d',$absence);

                for ($q = 0; $q < $difference+1; $q++) {
                    if ($approved[$n]['approved'] == 1) {
                        echo '<td class="center green">';
                    } elseif ($approved[$n]['approved'] == 0 && $now <= $absence) {
                        echo '<td class="center orange">';
                    } elseif ($approved[$n]['approved'] == 0 && $now > $absence) {
                        echo '<td class="center red">';
                    }

                    for ($l = 0; $l < $count_types; $l++) {

                        if ($array_absences[$k]['type_FK'] == $types[$l]['type_ID']) {
                            echo $types[$l]['short'];
                        }
                    }

                    echo '</td>';
                }
            }

        }       

        //Days that are not absences                    

        //Skip this the amounts of $difference
        echo '<td ';

        //If weekend special coloring
        $date = "$current-$month-$j+1";
        $date = new DateTime($date);
        $day =  $date->format("w");             

        if ($day == 6 || $day == 0) {
            echo 'class = "weekend"';   
        }

        echo '>';
        echo '</td>';
        echo "\n";
    }
    echo '</tr>';
}

【问题讨论】:

  • 我不会评论这个烂摊子。但请不要使用 mysql_* 函数,它们已被贬值,并且有充分的理由。
  • 如果你想要一个多行的表格,那么你不能简单地“跳过”表格单元格——你要么必须输出空单元格,要么使用colspan来匹配总的单元格数在每一行。
  • @Luceos 我知道这一点,但是在这个应用程序中安全性根本不重要。
  • 先做计算,再做输出循环
  • @charlietfl 我认为这是最好的解决方案...

标签: php mysql loops html-table


【解决方案1】:

恐怕我并没有真正理解您的解释,但是,要在循环中跳过某些内容,您可以为此使用 continue 关键字。

例如:

for($i = 0; $i++; i<1000){
    if($i < 200 && $i > 100)
        continue;
    // Computations are here....
}

【讨论】:

  • 但是我怎样才能跳过它 x 次呢?在我的示例中,我需要跳过 2 次。
  • @Gintoki,你到底需要跳过哪里?什么是约束?(你为什么要跳过那个迭代)
  • 这真的很难解释,但我认为我的逻辑基础是错误的。如果我将整个代码发布到数据库中会对您有帮助吗?
  • 我找到了解决方案,但不是很干净。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多