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 循环中设置全局变量的主要内容,如果未能解决你的问题,请参考以下文章