我有几个变量来自$ POST _ ['array']中的一个数组我想做一些循环,例如foreach,它为变量中的每个值创建一个变量名,并为它赋值
例如,如果我有
$POST_['name'];
$POST_['last'];
$POST_['age'];
$POST_['sex'];
我希望循环从$ _POST中的数组创建每个变量,其变量名称如下所示:
$name = 'John';
$last = 'Doe';
$age = '32';
$sex = 'male';
注意 - 数组来自一个序列化的jquery字符串,它将表单中的所有变量和值组合成一个大字符串。
这可能吗?
答案 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);
}
在一个函数内部,作为第一行,没有造成任何伤害。
重要说明:您可能想,因为$_SERVER
是super global,此漏洞可能会发生在内一个功能。但是,在我的测试中,在 PHP Version 5.3.4 上,在函数内是安全的 - $_SERVER
,$_POST
,{{1} <},$_GET
,或者可能是其他超级全球,可能会被覆盖。
您也可以使用extract with extract_type options that do not overwrite。
在我看来,使用的最佳选择只是为摘录中的所有变量添加前缀:
$_SESSION
这样你就没有覆盖问题,但你也知道你从阵列中得到了所有东西。
如果你想手动(但仍然是动态的),或想要有条件地只提取一些变量,你可以使用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'];
那么这意味着当我们去处理表单时,我们正在查看一组值而不是一堆我们必须检索的单个值。
所以我们可以简单地去超级全球发布并要求一个项目:即用户。我们得到的是一个关联数组。因此,我们不必通过一次一个地检索所有这些值来构建该数组,而是立即给出一个数组,因为我们以不同的方式命名了表单字段。