使用foreach制作的PHP变量

Lui*_*ado 6 php post

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

例如,如果我有

$POST_['name'];
$POST_['last'];
$POST_['age'];
$POST_['sex'];
Run Code Online (Sandbox Code Playgroud)

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

$name = 'John';
$last = 'Doe';
$age = '32';
$sex = 'male';
Run Code Online (Sandbox Code Playgroud)

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

这可能吗?

Nic*_*ole 17

你不需要循环,你想要提取:

extract($_POST); // But use caution, see below
Run Code Online (Sandbox Code Playgroud)


注意事项和最佳做法

如注释中所述,这会强制$_POST数组中的所有参数进入当前符号空间.

在全球空间

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

上面的代码说明了这个问题所示的问题 - 一些非常危险的事情可以在全球空间中被覆盖.

内部功能

function myFunc() {
    // (Mostly) empty symbol space! (excluding super globals)
    extract($_POST);
}
Run Code Online (Sandbox Code Playgroud)

在功能内部,作为第一线,没有伤害.

重要提示:您可能认为既然$_SERVER超级全局的,那么这个漏洞也可能发生函数内部.然而,在我的测试,在PHP 5.3.4版本,它是一个函数内部安全 -既不是$_SERVER,$_POST,$_GET,$_SESSION,或可能其他超全局,可能会被覆盖.

有选项

您还可以将extract与extract_type选项一起使用,这些选项不会覆盖.

在我看来,最好的选择是简单地从提取中加上所有变量的前缀:

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

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

echo $request_get_test; // 1
echo $request_get_name; // Joe
Run Code Online (Sandbox Code Playgroud)

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

交替 - 循环w /有条件

如果您想手动(但仍然是动态地)执行此操作,或者想要有条件地仅提取一些变量,则可以使用变量变量:

foreach ($_POST as $key => $value) {
    if (isset($$key)) continue;

    $$key = $value;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 使用`$ _POST`时这样做不是一个好主意 (2认同)
  • 在帖子中有一个指向手册的链接,它显然有防止覆盖的选项,如果方法使用得当它就好了,如果你知道最初会在帖子中,你应该有一个像样的足够的命名约定,以便不覆盖已经实例化的变量.我个人认为这比foreach好,只是因为它更清洁,并迫使你有更好的命名标准. (2认同)

Jak*_*e N 13

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

你可以这样做:

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

  • 同意您. (3认同)
  • 两张选票,没有评论,很棒的社区! (2认同)