【问题标题】:Array elements into variables数组元素到变量中
【发布时间】:2011-08-03 17:03:59
【问题描述】:
$data = array (                 
            'id'    => $_POST["id"],
            'name'  => $_POST["name"],
            'email' => $_POST["email"]
            );

是否有一个 php 函数可以将数组键转换为具有数组值的变量?例如,我可以简单地使用echo $name,而不是通过echo $data['name'] 回显一个值。

请不要建议使用 foreach 循环的解决方案(如果可能)。

【问题讨论】:

    标签: php arrays variables


    【解决方案1】:

    extract 就是这样做的:(docs)

     $size = "large";   
     $var_array = array("color" => "blue",
                           "size"  => "medium",
                           "shape" => "sphere");
     extract($var_array, EXTR_PREFIX_SAME, "wddx");
    
     echo "$color, $size, $shape, $wddx_size\n";
    

    list 也可以,以更可控的方式 (docs),请注意您的源数组必须是数字索引 - 这里不允许使用关联数组:

        $info = array('coffee', 'brown', 'caffeine');
    
        // Listing all the variables
        list($drink, $color, $power) = $info;
        echo "$drink is $color and $power makes it special.\n";
    

    【讨论】:

    • 谢谢! extract() 似乎有效。但是我不确定list() 是否适用于关联数组。
    • 您说得对,先生,列表仅用于数字索引数组。我将编辑我的答案以表明这一事实。
    【解决方案2】:

    【讨论】:

    • 请,请,请 - 不要直接在 $_POST/$_GET/$_REQUEST 上运行 extract()
    • 同意!提取对于“Johnny Nextguy”来说已经是一种令人沮丧的功能,在 $_POST 上运行它是一个令人头疼的问题。
    • 是的,我不得不同意,这不是一个好主意,但你可以在任何关联数组上使用它
    【解决方案3】:

    http://php.net/manual/fr/function.list.php

    您可能正在寻找列表函数,因此您知道您正在处理哪个变量。

    列表($var, $var2) = $_POST;

    【讨论】:

    • 正如 OP 所指出的,list 仅对数字索引数组有效。
    【解决方案4】:

    在这种情况下,foreach 循环实际上是一个非常紧凑的解决方案...

    foreach ( $data as $key => $value ) { $$key = $value; }
    

    虽然,简单地通过键引用数组本身就相当整洁......

    echo $data['id'];
    

    【讨论】:

    • 为什么要使用 foreach 循环来复制extract 的功能,考虑到只有一个函数调用可以实现相同的结果,这种紧凑性如何?通常我不会对这种低效率投反对票,但在这种情况下,您在extract 被给出作为答案(由几个人)之后 10 分钟来建议执行完全相同的事情的更长代码......毫无意义。
    • 那你误会了。 extract() 的安全问题与使用 register_globals = On 选项运行 PHP 的类型相同。这就是为什么在我上面的评论中,我警告不要直接在 GPC 阵列上运行 extract()。但是,如果你学会了如何使用额外的参数 extract() (尤其是前缀),你会感到非常安全。
    • @Cyber​​Junkie:验证不是卫生。一般来说,请确保 extract() 不会覆盖您不喜欢的任何变量(例如 $loggedAsAdmin 或其他东西;))。其余的处理就像您处理来自用户空间的任何数据一样。
    • 是的,在您自己制作的阵列上使用它是安全的。只要确保添加 cmets,不要在包含的文件中使用 extracted 值,也不要为了 Pete 的缘故将它们设为全局。看 - 人们会告诉你很多事情“永远不要做 XXX”或“XXX 是有害的”。 “不好的做法”,他们尖叫。这都是愚蠢的。如果一种语言有一个特性,那么就有一个合适的时间和方式来使用它。某些功能,例如提取,必须谨慎使用,因为它们很容易被误用。这并不意味着他们有瘟疫。如果它们如此糟糕,那么它们就不会出现在这种语言中。
    • 即使eval() 有时也不是邪恶的;P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2012-12-11
    相关资源
    最近更新 更多