PHP 日历中的假期错误未定义变量



我在网上发现了一些随机代码,并尝试将其用于我的日历,但我不断收到此错误:

Notice: Undefined variable: nextHoliday

此错误指的是末尾的代码"RETURN $nextHoliday;

我相信 nextHoliday 是定义的,所以我尝试了一些事情,但没有任何效果.. 有人可以帮忙吗?

代码如下:

FUNCTION GetTimeStamp($MySqlDate) 
  { 

  $date_array = EXPLODE("-",$MySqlDate); // split the array 
  $var_year = $date_array[0]; 
  $var_month = $date_array[1]; 
  $var_day = $date_array[2]; 
  $var_timestamp = MKTIME(0,0,0,$var_month,$var_day,$var_year); 
  RETURN($var_timestamp); // return it to the user 
  }  // End function GetTimeStamp() 
FUNCTION ordinalDay($ord, $day, $month, $year) 
  // ordinalDay returns date of the $ord $day of $month. 
  // For example ordinalDay(3, 'Sun', 5, 2001) returns the 
  // date of the 3rd Sunday of May (ie. Mother's Day). 
  // 
  // Note: $day must be the 3 char abbr. for the day, as 
  //       given by date("D"); 
  // 
  { 
  $firstOfMonth = GetTimeStamp("$year-$month-01"); 
  $lastOfMonth  = $firstOfMonth + DATE("t", $firstOfMonth) * 86400; 
  $dayOccurs = 0; 
  FOR ($i = $firstOfMonth; $i < $lastOfMonth ; $i += 86400) 
     { 
     IF (DATE("D", $i) == $day) 
       { 
       $dayOccurs++; 
       IF ($dayOccurs == $ord) 
         { $ordDay = $i; } 
       } 
     } 
  RETURN $ordDay; 
  }  // End function ordinalDay() 
FUNCTION getNextHoliday() 
   // Looks through a lists of defined holidays and tells you which 
   // one is coming up next. 
   // 
   { 
   $year = DATE("Y"); 
   CLASS holiday 
     { 
     VAR $name; 
     VAR $date; 
     VAR $catNum; 
     FUNCTION holiday($name, $date, $catNum) 
        // Contructor to define the details of each holiday as it is created. 
        { 
        $this->name   = $name;   // Official name of holiday 
        $this->date   = $date;   // UNIX timestamp of date 
        $this->catNum = $catNum; // category, we used for databases access 
        } 
     } // end class holiday 
   $holidays[] = NEW holiday("Groundhog Day", GetTimeStamp("$year-2-2"), "20"); 
   $holidays[] = NEW holiday("Valentine's Day", GetTimeStamp("$year-2-14"), "14"); 
   $holidays[] = NEW holiday("St. Patrick's Day", GetTimeStamp("$year-3-17"), "15"); 
   $holidays[] = NEW holiday("Easter", EASTER_DATE($year), "16"); 
   $holidays[] = NEW holiday("Mother's Day", ordinalDay(2, 'Sun', 5, $year), "3"); 
   $holidays[] = NEW holiday("Father's Day", ordinalDay(3, 'Sun', 6, $year), "4"); 
   $holidays[] = NEW holiday("Independence Day", GetTimeStamp("$year-7-4"), "17"); 
   $holidays[] = NEW holiday("Christmas", GetTimeStamp("$year-12-25"), "13"); 
   $numHolidays = COUNT($holidays); 
   FOR ($i = 0; $i < $numHolidays; $i++) 
     { 
     IF ( DATE("z") > DATE("z", $holidays[$i]->date) && DATE("z") <= DATE("z", 
          $holidays[$i+1]->date) ) 
        { 
        $nextHoliday["name"]      = $holidays[$i+1]->name; 
        $nextHoliday["dateStamp"] = $holidays[$i+1]->date; 
        $nextHoliday["dateText"]  = DATE("F j, Y", $nextHoliday["dateStamp"]); 
        $nextHoliday["num"]       = $holidays[$i+1]->catNum;         
        } 
     } 
   RETURN $nextHoliday; 
   } // end function GetNextHoliday 

$nextHoliday = getNextHoliday(); 
ECHO $nextHoliday["name"]." (".$nextHoliday["dateText"].")"; 

您有两种选择之一。实例化数组值的空键:

$nextHoliday = array();
$nextHoliday['name'] = '';
$nextHoliday['dateStamp'] = '';
$nextHoliday['dateText'] = '';
$nextHoliday['num'] = '';
$numHolidays = COUNT($holidays); 
for ($i = 0; $i < $numHolidays; $i++) {
    // ... Blah
}

或者在每次数组查找之前使用 isset:

echo (isset($nextHoliday['name'] ? $nextHoliday['name'] : '') . 
" (" . 
(isset($nextHoliday) ? $nextHoliday["dateText"] : '' ) . 
")";

没有什么比内联条件的三元运算符更好的了。

我们在一月份对此进行测试实际上很好,否则此错误稍后会咬您。问题是您使用的小于/大于来确定下一个假期是什么。这没有考虑到去年的最后一个假期。

要解决此问题,变量 $lastHoliday 需要是上一个假日的负表示:

$numHolidays = COUNT($holidays);
$nextHoliday = array('name' => '', 'dateStamp' => '', 'dateText' => '', 'num' => '');
for ($i = 0; $i < $numHolidays - 1; $i++) {
    $today = DATE("z");
    if ($i == 0) {
        $lastHoliday = (365 - DATE("z", $holidays[$numHolidays - 1]->date)) * -1;
    } else {
        $lastHoliday = DATE("z", $holidays[$i]->date);
    }
    $futureHoliday = DATE("z", $holidays[$i+1]->date);
    //print_r($today); echo "<br />";
    //print_r($lastHoliday); echo "<br />";
    //print_r($futureHoliday); echo "<br />";
    if ($today > $lastHoliday && $today <= $futureHoliday ) {
        $nextHoliday["name"]      = $holidays[$i+1]->name;
        $nextHoliday["dateStamp"] = $holidays[$i+1]->date;
        $nextHoliday["dateText"]  = DATE("F j, Y", $nextHoliday["dateStamp"]);
        $nextHoliday["num"]       = $holidays[$i+1]->catNum;
    }
}

还可以考虑以小写而不是大写形式键入 PHP,因为它几乎是 PHP 中的通用标准。一种真正的支撑样式也不会受到伤害。

$nextHoliday用于

if但未声明

for之前声明变量:

[...]
$nextHoliday = array();
FOR ($i = 0; $i < $numHolidays; $i++) 
[...]

最新更新