【问题标题】:PHP variable scope - setting globals inside foreach loopsPHP 变量范围 - 在 foreach 循环中设置全局变量
【发布时间】:2023-03-24 07:02:01
【问题描述】:

我是 PHP 新手,已经阅读了 PHP Variable scope docsother Stackoverflow threads 并且无法理解为什么在 foreach 循环中设置全局变量不起作用:

if (isset($regionsArr) && $page == 'regions') {
  $param = htmlspecialchars($_GET["region"]);
  foreach ($regionsArr as $item) {
    if ($item['region'] == $param) {
      global $curRegion;
      $curRegion = $item;
      echo $GLOBALS["curRegion"]["name"]; // works
    } else {
      $curRegion = null;
    }
  }
}
if (isset($GLOBALS["curRegion"])) {
  echo $GLOBALS["curRegion"]["name"]; // does not work
}

【问题讨论】:

  • $GLOBALS["curRegion"]$curRegion,猜猜你在foreach的后续迭代中覆盖它,你可以只使用$curRegion,然后一旦匹配到break;,就不会被覆盖
  • @LawrenceCherone 你是救世主。 break; 就是一切。非常感谢您没有投票反对! :)
  • np,您可以通过使用 array_filter、array_reduce 或 array_column、array_search 等来删除大部分代码3v4l.org/mZ02t
  • @LawrenceCherone 谢谢先生。 PS...如果你碰巧看硅谷,我哥哥马特扮演加文贝尔森:)

标签: php scope globals


【解决方案1】:

感谢@lawrencecherone 指出我需要break; 退出循环。

没有刹车,循环继续,在循环中成功设置后将$curRegion覆盖为null。

注意:如果碰巧匹配的 $item 恰好是循环中的最后一项,那么它不会被覆盖,但是...是的...只需添加 break;

foreach ($regionsArr as $item) {
  if ($item['region'] == $param) {
    $curRegion = $item;
    break; // this kills the loop after $item['region'] matches $param
  } else {
    $curRegion = null;
  }
}

我相信使用 array_filter 或其他方法可以更简洁地完成上述操作,我欢迎它作为解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-26
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 2015-03-22
    • 2016-01-14
    • 2012-01-19
    相关资源
    最近更新 更多