PHP - 循环'false',当它为'true'时停止

时间:2013-05-22 09:45:31

标签: php

我想明天约会。但如果明天是SaturdaySunday。它将在Monday中获取日期。它将跳过周六和周日。此外,如果明天是假日,它将跳过日期并获得下一个日期。我的数据库中有假日日期列表。

我正在尝试这段代码。假设今天是Friday, May 24

$today = "2013-05-24";

$tommorow = date('Y-m-d', strtotime($today . ' + 1 day'));
$valid = check_valid($tommorow);
while (!$valid){
    $tommorow = date('Y-m-d', strtotime($today . ' + 1 day'));
    $valid = check_valid($tommorow);
    if($valid){
        break;
    }
}

function check_valid($date){
    return true;
    $timestamp = strtotime($date);
    $day = date('D', $timestamp);
    if ($day == "Sat" || $day == "Sun"){
        return false;
    }
    $mysql= mysql_query("SELECT * FROM holiday_data WHERE date = '$date'");
    if (mysql_num_rows($mysql) >= 1){
        return false;
    }
}

我正在使用while子句,因为我假设有holiday date连续两三天出现。例如,假期是5月27日和28日,那么明天日期应该是Wednesday

有什么想法吗? 你能帮帮我吗?

如果你有另一种方法来实现这一点,我也想知道它。

谢谢,

6 个答案:

答案 0 :(得分:0)

正如Syjin已经说过的那样,check_valid()将永远返回true,因为您在函数开头已经有return true;

如果函数之前没有返回true,请将其移至函数末尾以返回false

答案 1 :(得分:0)

此函数检查(使用您的逻辑)时间戳是否有效以及是否搜索下一个有效时间戳。它将返回可能的第一个有效时间戳的时间戳。

function getNextValidDay($timestamp) {
    $day = date('D', $timestamp);
    if ($day == "Sat" || $day == "Sun"){
        $timestamp += 60*60*24;
        return getNextValidDay($timestamp);
    }
    $mysql= mysql_query("SELECT * FROM holiday_data WHERE date = '$timestamp'");
    if (mysql_num_rows($mysql) >= 1){
        $timestamp += 60*60*24;
        return getNextValidDay($timestamp);
    }
    return $timestamp;
}

答案 2 :(得分:0)

问题出在函数check_valid()中。你在函数的最开始就返回了true,所以它不允许处理剩余的代码所以它应该是这样的,

function check_valid($date){

    $timestamp = strtotime($date);
    $day = date('D', $timestamp);
    if ($day == "Sat" || $day == "Sun"){
        return false;
    }
    $mysql= mysql_query("SELECT * FROM holiday_data WHERE date = '$date'");
    if (mysql_num_rows($mysql) >= 1){
       return false;
     } 
    return true;
}

答案 3 :(得分:0)

这是代码,做,你需要的:

它使用DateTime类和do-while循环:

<?php
function not_valid($date){

      $weekday = $date->format('l');
      if ($weekday == "Saturday" || $weekday == "Sunday"){
            return true;
      }

      $str_date = $date->format('Y-m-d');

      $mysql= mysql_query("SELECT * FROM holiday_data WHERE date = '$str_date'");
      if (mysql_num_rows($mysql) >= 1){
            return true;
      }

      return false;
}

$today = new DateTime("2013-05-24");
do{
      //add 1 day
      $today->add(new DateInterval('P1D'));
}while(not_valid($today));

print $today->format('Y-m-d');
?>

一开始是2013年5月24日 - 星期五。然后它加1。 25和26是星期六和星期日,因此它会跳过它们并打印2013-05-27。

答案 4 :(得分:0)

你应该在每个循环中更新/增加'+ 1天'。将您的代码更改为此类

$today  = "2013-05-24";
$ii_day = 1;

$tommorow = date('Y-m-d', strtotime($today . ' + '.($ii_day).' day'));
$valid = check_valid($tommorow);
while (!$valid){
    $ii_day++;
    $tommorow = date('Y-m-d', strtotime($today . ' + '.($ii_day).' day'));
    $valid = check_valid($tommorow);
    if($valid){
        break;
    }
}

然后在check_valid函数上,稍微更改一下代码。

function check_valid($date){
    //return true;
    $timestamp = strtotime($date);
    $day = date('D', $timestamp);
    if ($day == "Sat" || $day == "Sun"){
        return false;
    }
    else {
        $mysql= mysql_query("SELECT * FROM holiday_data WHERE date = '$date'");
        if (mysql_num_rows($mysql) >= 1){
           return false;
        }
        else 
            return true;
    }
}

希望它有效..:)

答案 5 :(得分:0)

你可以尝试这个解决方案,这是基于我在几个项目中使用的工作日代码。它使用瑞典假期,但您可以根据您所在国家/地区的假期进行调整。请记住,许多假期取决于当前年份。

function next_valid_day() {
    $year = date('Y');

    $easter_date = easter_date($year);

    $holidays = array(
                      mktime(0, 0, 0, 1, 1, $year),                                                     // Nyårsdagen
                      mktime(0, 0, 0, 1, 6, $year),                                                     // Trettondedag jul
                      //strtotime('-3 days', $easter_date),                                             // Skärtorsdagen
                      strtotime('-2 days', $easter_date),                                               // Långfredagen
                      strtotime('-1 day', $easter_date),                                                // Påskafton
                      $easter_date,                                                                     // Påskdagen
                      strtotime('+1 day', $easter_date),                                                // Annandag påsk
                      mktime(0, 0, 0, 5, 1, $year),                                                     // 1:a maj
                      strtotime('+39 days', $easter_date),                                              // Kristi himmelsfärdsdag
                      mktime(0, 0, 0, 6, 6, $year),                                                     // Sveriges nationaldag
                      strtotime('-1 day', strtotime('next Saturday', mktime(0, 0, 0, 6, 19, $year))),   // Midsommarafton
                      mktime(0, 0, 0, 12, 24, $year),                                                   // Julafton
                      mktime(0, 0, 0, 12, 25, $year),                                                   // Juldagen
                      mktime(0, 0, 0, 12, 26, $year),                                                   // Annandag jul
                      mktime(0, 0, 0, 12, 31, $year)                                                    // Nyårsafton
                     );

    $valid_date = false;
    $d = 0;

    while ($valid_date === false) {
        $date = strtotime('+' . ++$d  . ' days');

        if (!in_array($date, $holidays) && !(date('N', $date) > 5)) {
            $valid_date = true;
        }
    }

    return date('Y-m-d', $date);
}

var_dump(next_valid_day());