PHP - Loop у той час як "хлусьня", прыпынак, калі гэта "ісціна"

Я хачу, каб атрымаць дату заўтра. Але калі заўтра суботу або нядзелю . Ён будзе атрымліваць дату ў панядзелак . Ён прапусціць у суботу і нядзелю. Акрамя таго, калі заўтра будзе свята, ён будзе паказваць дату і атрымаць наступную дату. У мяне ёсць спіс даты свята ў маёй базе дадзеных.

Я спрабую гэты код. Уявім, што сёння з'яўляецца пятніца, 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;
    }
}

Я выкарыстоўваю , а становішча, таму што я мяркую, што ёсць дата свята , які з'яўляецца ў двух ці трох дзён запар. Напрыклад, свята 27 траўня і 28, то дата заўтра павінен быць у сераду .

Любыя ідэі? Не маглі б вы мне дапамагчы, калі ласка?

Калі ў вас ёсць іншы падыход для дасягнення гэтай мэты, я таксама хачу ведаць.

Дзякуй,

1
Падобна на тое, вы проста ў канчатковым выніку затрымаўся ў пятлі infinte, таму што ён увесь час правяраючы, калі $ </Заўтра код> выкарыстоўваючы $ сёння + 1 дзень ... які заўсёды будзе ў суботу (калі гэта было ў выходныя дні). Паспрабуйце выкарыстоўваць $ = дата Заўтра ( 'У-м-д', StrToTime ($ заўтра '+ 1 дзень').);
дададзена аўтар naththedeveloper, крыніца
Падобна на тое, вы проста ў канчатковым выніку затрымаўся ў пятлі infinte, таму што ён увесь час правяраючы, калі $ </Заўтра код> выкарыстоўваючы $ сёння + 1 дзень ... які заўсёды будзе ў суботу (калі гэта было ў выходныя дні). Паспрабуйце выкарыстоўваць $ = дата Заўтра ( 'У-м-д', StrToTime ($ заўтра '+ 1 дзень').);
дададзена аўтар naththedeveloper, крыніца
якая праблема вы з? Вы проста павінны вярнуць праўдзівае значэнне ў канцы, а не ў пачатку ў «check_valid» функцыі.
дададзена аўтар Muhammad, крыніца
якая праблема вы з? Вы проста павінны вярнуць праўдзівае значэнне ў канцы, а не ў пачатку ў «check_valid» функцыі.
дададзена аўтар Muhammad, крыніца
Ваша check_valid функцыя заўсёды вяртае ісціну ...
дададзена аўтар Syjin, крыніца
Я думаю, вам лепш выкарыстоўваць дату ( «N»), чым дата ( «D») для параўнання. Дата ( «N») вяртае цэлы лік (нумар дня ў тыдні). Гэта толькі пачатак.
дададзена аўтар netvision73, крыніца
Я думаю, вам лепш выкарыстоўваць дату ( «N»), чым дата ( «D») для параўнання. Дата ( «N») вяртае цэлы лік (нумар дня ў тыдні). Гэта толькі пачатак.
дададзена аўтар netvision73, крыніца
Мой вынік код $ заўтра гэта 25 Беларусі . Я думаю, што , а з'яўляецца праблемай.
дададзена аўтар kaitosenpai, крыніца
@AlexKevler я змяніць на «N», выкарыстоўваючы цэлы лік, і гэта працуе. Дзякуй.
дададзена аўтар kaitosenpai, крыніца
@AlexKevler я змяніць на «N», выкарыстоўваючы цэлы лік, і гэта працуе. Дзякуй.
дададзена аўтар kaitosenpai, крыніца

11 адказы

Вось код, рабіць тое, што вам трэба:

Ён выкарыстоўвае клас DateTime і рабіць-то час цыкла:

<?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/05/24 - пятніца. Затым ён дадае да яго 1. 25 і 26 з'яўляюцца субота і нядзеля, таму ён прапускае іх і друкуе 2013/05/27.

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());
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());
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;
}
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;
}
0
дададзена

Як Syjin ўжо сказаў, ваш check_valid() заўсёды вяртае True , таму што ў вас ёсць вяртае ісціну; у пачатку вашай функцыі ,

Перамясціць яго ў канцы вашай функцыі для вяртання True калі функцыя не вяртаецца хлусня раней.

0
дададзена

Як Syjin ўжо сказаў, ваш check_valid() заўсёды вяртае True , таму што ў вас ёсць вяртае ісціну; у пачатку вашай функцыі ,

Перамясціць яго ў канцы вашай функцыі для вяртання True калі функцыя не вяртаецца хлусня раней.

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

спадзяюся, ён працуе .. :)

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

спадзяюся, ён працуе .. :)

0
дададзена

Праблема заключаецца ў функцыі check_valid (). Вы вярнуліся праўда ў самым пачатку функцыі, так што не дазволіць перапрацоўваць пакінуты код, ён павінен быць нешта накшталт гэтага,

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;
}
0
дададзена

Праблема заключаецца ў функцыі check_valid (). Вы вярнуліся праўда ў самым пачатку функцыі, так што не дазволіць перапрацоўваць пакінуты код, ён павінен быць нешта накшталт гэтага,

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;
}
0
дададзена