PHP 变量范围 - 在 foreach 循环中设置全局变量

Posted

技术标签:

【中文标题】PHP 变量范围 - 在 foreach 循环中设置全局变量【英文标题】:PHP variable scope - setting globals inside foreach loops 【发布时间】:2021-12-06 19:27:00 【问题描述】:

我是 php 新手,已经阅读了 PHP Variable scope docs 和 other *** 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...如果你碰巧看硅谷,我哥哥马特扮演加文贝尔森:) 【参考方案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 或其他方法可以更简洁地完成上述操作,我欢迎它作为解决方案。

【讨论】:

以上是关于PHP 变量范围 - 在 foreach 循环中设置全局变量的主要内容,如果未能解决你的问题,请参考以下文章

PHP - foreach循环中变量之前的&符号[重复]

如何在php中访问foreach循环之外的多个变量

php foreach循环中的变量

PHP foreach循环中的多个索引变量

我们如何在 laravel php 刀片模板中为 foreach 循环定义循环变量

如何在 foreach 循环中设置变量以在 PHP 中进行外部访问?