使用foreach制作的PHP变量

时间:2011-05-16 21:08:05

标签: php post

我有几个变量来自$ POST _ ['array']中的一个数组我想做一些循环,例如foreach,它为变量中的每个值创建一个变量名,并为它赋值

例如,如果我有

$POST_['name'];
$POST_['last'];
$POST_['age'];
$POST_['sex'];

我希望循环从$ _POST中的数组创建每个变量,其变量名称如下所示:

$name = 'John';
$last = 'Doe';
$age = '32';
$sex = 'male';

注意 - 数组来自一个序列化的jquery字符串,它将表单中的所有变量和值组合成一个大字符串。

这可能吗?

5 个答案:

答案 0 :(得分:16)

您不需要循环,您需要extract

extract($_POST); // But use caution, see below


注意事项和最佳做法

正如评论中所述,这会强制$_POST数组中的所有参数进入当前符号空间。

在全球空间

<?php
extract($_GET);
var_dump($_SERVER); // Can be overwritten by the GET param
?>

上面的代码说明了问题as shown in this answer - 在全局空间中可以覆盖一些非常危险的事情。

在函数内部

function myFunc() {
    // (Mostly) empty symbol space! (excluding super globals)
    extract($_POST);
}

在一个函数内部,作为第一行,没有造成任何伤害。

重要说明:您可能,因为$_SERVERsuper global,此漏洞可能会发生在一个功能。但是,在我的测试中,在 PHP Version 5.3.4 上,在函数内是安全的 - $_SERVER$_POST,{{1} <},$_GET,或者可能是其他超级全球,可能会被覆盖。

使用选项

您也可以使用extract with extract_type options that do not overwrite

在我看来,使用的最佳选择只是为摘录中的所有变量添加前缀:

$_SESSION

这样你就没有覆盖问题,但你也知道你从阵列中得到了所有东西。

替代 - 循环w / conditional

如果你想手动(但仍然是动态的),想要有条件地只提取一些变量,你可以使用variable variables

// $_GET = test=1&name=Joe

extract($_GET, EXTR_PREFIX_ALL, "request_get");

echo $request_get_test; // 1
echo $request_get_name; // Joe

(我使用的示例条件是覆盖防止。)

答案 1 :(得分:12)

使用extract()时尽量不要使用$_POST。您可能会覆盖所需的变量,从而导致不可预测的行为。进入是一个坏习惯,而动态可能不是最好的解决方案。

您可以这样做:

foreach($_POST as $key => $value)
{
    switch($key)
    {
        case "name":
            $name = $value;
        break;
        case "last":
            $last = $value;
        break;
    }
}

答案 2 :(得分:2)

为什么不使用foreach

foreach($_POST as $key=>$val){
    ${$key} = $val;
}

答案 3 :(得分:1)

您实际上可以使用名为extract

的内置函数

答案 4 :(得分:0)

我只想提一下你可以改进foreach技术,因为我们在HTML中能够使用方括号表示法命名我们的一个表单字段,如果我们这样做,那么HTML将会提交一系列的值作为数组。

<input name="user[name]">
<input name="user[last]">
<input name="user[age]">
<input name="user[sex]">

只使用一行代码将输入字段中的所有值分配到本地数组$ args。

$args = $_POST['user'];

那么这意味着当我们去处理表单时,我们正在查看一组值而不是一堆我们必须检索的单个值。

所以我们可以简单地去超级全球发布并要求一个项目:即用户。我们得到的是一个关联数组。因此,我们不必通过一次一个地检索所有这些值来构建该数组,而是立即给出一个数组,因为我们以不同的方式命名了表单字段。