如何在每次迭代后销毁循环中定义的变量?

时间:2015-10-25 23:07:09

标签: php loops scope iteration

在PHP中,循环中定义的变量不是循环的局部变量。有没有办法破坏/取消设置每次迭代后声明的每个变量?

如果我在if循环中的foreach语句中声明变量,则会出现问题。这个变量不一定是在每次迭代时声明的,所以当我希望它被销毁时,它有可能在上一次并且具有与上次相同的值!

具体来说,这是我的(简化)代码。它解析包含events.xml元素的<event>文件,这些元素都有<startDate>个子元素,可能有也可能没有<endDate>子元素,然后形成html,显示循环遍历它们之后的事件。

<html>

  <?php
  $events = simplexml_load_file("events.xml");
  foreach ($events as $value):
    // get the start date of the current event from the xml file
    $startDate = strtotime($value->startDate);
    // get the end date if it exists (it might not)
    $endDate = strtotime($value->endDate);
    // get day of the week from the start date
    $startDay = date("D", $startDate);
    if ($endDate) {
      $endDay = date("D", $endDate);
      $dash = "-";
    }
  ?>

    <div class="event"> <!-- this is still in the foreach loop -->
      <!-- insert the start day (always) followed by a dash and end day (if they exist) -->
      <?php echo $startDay, $dash, $endDay; ?>
    </div>
  <?php endforeach; ?>

</html>

问题在于,如果在events.xml文件中,我有一个结束日期后跟没有结束日期的事件的事件,后者的div将具有前者的结束日期(因为当我不希望它有结束日期时,$endDay变量没有被取消。 (如果在xml文件的顶部有一个没有结束日期的事件,则其div将没有结束日期。)

有趣的是,对于没有结束日期的事件,$endDate变量似乎在此行中被销毁:$endDate = strtotime($value->endDate);,大概是因为它试图从xml中读取它并找不到任何内容。但是如果我将$endDay声明放在if语句之外,那么它默认会转到01,这是我不想要的。

1 个答案:

答案 0 :(得分:1)

你必须自己重置变种。它们在当前范围内都是可见的,循环或条件没有自己的变量范围。

在您的情况下,您必须在每次迭代时重置$dash$endDay - 即

  foreach ($events as $value):
      $dash = null;
      $endDay = null;
      //...
  ?>
每次迭代都会覆盖

$startDate$endDate。如果$value->start/endDate未设置或日期无效,则会将false作为值。