我的PHP引用(&)有一个奇怪的问题。
假设我的表格看起来像:
<form name="form1" id="form1" method="post">
Name: <input type="text" name="name" /><br />
Email: <input type="text" name="email" /><br />
Location: <input type="text" name="location" /><br />
Phone Number: <input type="text" name="phonenumber" /><br />
</form>
然后我将该表单提交给另一个PHP处理程序。处理程序执行此操作:
foreach($_POST as $name => &$value)
{
//more code here
}
echo $_POST['phonenumber']; //Returns value of $_POST['location'] for some reason
有人可以向我解释为什么电话号码的价值会是什么位置的价值?即使foreach中没有代码,它仍然会这样做。
编辑:
对于那些想知道foreach内部的内容,或者为什么我甚至这样做,这是因为它是一种干净的方式来逃避提交给处理程序的所有数据,而不是一次手动执行一个变量,特别是当你有动态输入时。就像这样:
foreach($_POST as $name => &$value)
{
$value = preg_replace( "/[<>#$%]/", "", $value);
$value = preg_replace('/\s\s+/', ' ', $value);
}
除了上面提到的问题外,它的工作非常精彩。
答案 0 :(得分:3)
您是否可以迭代两次,一次使用引用,一次不使用?它有很大的不同:
$array = [1, 2];
foreach($array as &$value);
echo implode(',', $array); # 1, 2
foreach($array as $value);
echo implode(',', $array); # 1, 1
And here's a demo.修复方法是unset $value
between the loops:
$array = [1, 2];
foreach($array as &$value);
echo implode(',', $array); # 1, 2
unset($value);
foreach($array as $value);
echo implode(',', $array); # 1, 2
答案 1 :(得分:1)
我很确定您对foreach
循环中的引用值感到困惑。你不应该使用它的另一个原因。如果你真的认为在循环之后至少需要unset()
value
。看看这个例子:http://codepad.viper-7.com/VCOI2O(注意第一个转储中的phonenumber上的&
,它仍然被引用)。
但我认真地认为你应该重新考虑参考。而只需访问循环中所需的项目:
foreach($_POST as $name => $value)
{
// do with the value what you want
$_POST[$name] = $value;
}
然而,根本不更改$_POST
超级全球会更好。当你稍后尝试访问它时,它只会让其他人和你自己感到困惑,并且其中的内容已经发生了变化。
答案 2 :(得分:0)
如果您重新定位$value
变量,可能会发生这种情况。例如,在这种情况下,最后一次迭代(对于电话号码)将等于位置值,因为&
表示如果您为其分配值,将更新该值:
<?php
$i = 0;
foreach($_POST as $name => &$value) {
if ($i > 2) {
$value = $temp;
}
$i++;
$temp = $value;
echo $value;
}
?>