php假日日历错误未定义变量

时间:2014-01-15 15:15:21

标签: 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"].")"; 

2 个答案:

答案 0 :(得分:2)

$ nextHoliday用于if但未声明

for

之前声明变量
[...]
$nextHoliday = array();
FOR ($i = 0; $i < $numHolidays; $i++) 
[...]

答案 1 :(得分:2)

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

$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"] : '' ) . 
")";

对于内联条件,没有比三元运算符更好的了。

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

要解决这个问题,变量$ 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中的通用标准。一种真正的支撑方式也不会受伤。