PHP引用代理奇怪

时间:2012-08-26 00:18:29

标签: php post reference foreach

我的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);
}

除了上面提到的问题外,它的工作非常精彩。

3 个答案:

答案 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;
}

?>