PHP-循环while';假';,在'时停止;正确';

PHP-循环while';假';,在'时停止;正确';,php,Php,我想要明天的约会。但是如果明天是星期六或星期天。它将在星期一中获取日期。它将跳过周六和周日。另外,如果明天是假日,它将跳过日期并获得下一个日期。我的数据库中有假期日期的列表 我正在尝试这个代码。假设今天是5月24日星期五 $today = "2013-05-24"; $tommorow = date('Y-m-d', strtotime($today . ' + 1 day')); $valid = check_valid($tommorow); while (!$valid){ $t

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

我正在尝试这个代码。假设今天是5月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
子句,是因为我假设有一个
假日日期
连续出现在两三天内。例如,假日是5月27日和28日,那么明天的日期应该是
星期三

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

如果你有其他方法来实现这一点,我也想知道


谢谢,

正如Syjin已经说过的,您的
check\u valid()
将始终返回
true
,因为您得到了一个
返回true在函数的开头

如果函数以前未返回
false
,则将其移动到函数末尾以返回
true

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

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

问题出在函数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;
}

以下是代码、操作和您需要的:

它使用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');
?>

您应该在每个循环中更新/增加“+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;
    }
}

希望它能工作。:)

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

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());

我的代码结果是
$moother
May 25
。我认为
while
子句是问题所在。我认为您最好使用date('N')而不是date('D')来进行比较。日期('N')返回整数(周中的天数)。这只是一个开始。你的check\u valid函数总是返回true…看起来你只是陷入了一个infinte循环,因为它一直在使用
$today+1天
检查
$tommorow
。。。哪一天总是星期六(如果是周末的话)。尝试使用
$tommorow=date('Y-m-d',strotime('tomorow.+1天')您遇到了什么问题?您只需在“check_valid”函数的末尾而不是开头返回true。