使用foreach循环初始化变量

时间:2012-05-06 04:35:42

标签: php arrays foreach variable-assignment

我建立了一个空的关联数组,其中键名称引用提交的帖子数据。我可以很好地捕获postdata,但是我试图实例化名称与数组键匹配的变量时遇到了麻烦。

例如:

$insArray = array('rUsername'=>'', 'rPass'=>'', 'rQuestion'=>'', 'rAnswer'=>'', 'rFName'=>'', 'rLName'=>'', 'rBDateD'=>'', 'rBDateM'=>'', 'rBDateY'=>'', 'rHCheck'=>'', 'rHCeckOption'=>'', 'rEmail'=>'');

foreach($insArray as $key=>$value){
    if (filter_input(INPUT_POST, $key) != ''){
        $key = stripslashes(filter_input(INPUT_POST, $key)); 
        $insArray[$key] = $key;
    }       
}

第一行创建空数组,然后foreach循环遍历此数组。现在它变得棘手。

filter_input(INPUT_POST, $key)捕获与当前密钥匹配的post数据中的值,在这种情况下为rUsername

$key是问题所在。我希望新变量的NAME是关联键名,例如我想在第一次迭代中用$ rUsername替换$ key,在第二次迭代中用$ rPass替换,依此类推。我尝试使用两个$$,但我知道这不对。从来没有尝试过这样做,但如果我能弄清楚它会有所帮助。

更新:

这是最终的代码,它是两个答案的组合。

if (isset($_POST['submit'])) {
    //Build array of variables to be put into database
    $insArray = array('rUsername'=>'', 'rPassword'=>'', 'rQuestion'=>'', 'rAnswer'=>'', 'rFName'=>'', 'rLName'=>'', 'rBDateD'=>'', 'rBDateM'=>'', 'rBDateY'=>'', 'rHCheck'=>'', 'rHCheckOption'=>'', 'rEmail'=>'');

    foreach(array_keys($insArray) as $key){
        $insArray[$key] = filter_input(INPUT_POST, $key);
        $$key = filter_input(INPUT_POST, $key);
    }
}

给我完全想要的输出,谢谢你们!

4 个答案:

答案 0 :(得分:2)

你根本没有访问$ _POST,所以你所做的只是自己定义一些数组成员,过滤它们以获取有害的POST字符(为什么你会尝试注入自己的代码?)然后创建一个来自那些自定义键值的新数组。

如果我猜对了你想要的东西,应该是这样的:

foreach(array_keys($insArray) as $key) {
    $insArray[$key] = stripslashes(filter_input(INPUT_POST, $_POST[$key]));
}

使用stripslashes表明你使用的是启用了magic_quotes的PHP的脑死亡版本。您应该升级到现代版本的PHP和/或关闭它们。

答案 1 :(得分:1)

解决方案是改变

$key = stripslashes(filter_input(INPUT_POST, $key));

$$key = stripslashes(filter_input(INPUT_POST, $key));

请参阅http://www.php.net/manual/en/language.variables.variable.php

另外,请重新检查您的代码,这些代码存在一些错误。

答案 2 :(得分:1)

如果我理解正确,我会建议这种方法:

$defaultValues = array('rUsername'=>'', 'rPass'=>'', 'rQuestion'=>'', 'rAnswer'=>'', 'rFName'=>'', 'rLName'=>'', 'rBDateD'=>'', 'rBDateM'=>'', 'rBDateY'=>'', 'rHCheck'=>'', 'rHCeckOption'=>'', 'rEmail'=>'');
$values = array_map('stripslashes', array_merge($defaultValues, array_filter($_POST)));
extract($values, EXTR_SKIP);
echo $rUsername;
echo $rPass;
.........

使用上面的代码段,您必须考虑以下内容

  • 我在EXTR_SKIP中使用extract函数,因此您不会覆盖现有变量。确保只使用代码中需要的变量并适当地清理它们。

  • 在$ _POST超全局im上使用array_filter“删除”所有空或空变量。因此,如果未通过$ _POST发送预期的密钥,则默认为$ defaultValues数组指定的值。

  • 我不太明白为什么在没有第三个参数(过滤器常量)的情况下使用filter_input

答案 3 :(得分:0)

希望这会有所帮助,如果不是,我可能会误解这个问题。

而不是

$key = stripslashes(filter_input(INPUT_POST, $key)); 
$insArray[$key] = $key;

尝试

$insArray[$key] =stripslashes(filter_input(INPUT_POST, $key));

然后在foreach循环之后

extract($insArray);