php - 提取关联数组

时间:2015-11-03 17:00:27

标签: php arrays extract

我正在尝试提取一个混合关联数组,如:

<pre>
        <?php


        bar();

        function bar(){
            $apple = 6;
            $ball = 2;
            $cat = 3;

            $data = ["apple" => 1, $ball,$cat];

            foo($data);
        }

        function foo($data){
            extract($data);
            echo "<br />apple:" . $apple;
            echo "<br />ball:" . $ball;
            echo "<br />cat:" .  $cat;
        }

        ?>
</pre>

$data数组只能是数字,只能是关联或两者。如果数组元素未命中索引,则它应与变量相同。

2 个答案:

答案 0 :(得分:5)

这在您的函数中不起作用,因为$ ball和$ cat未在函数范围中定义。如果数组中的值有一个键,那么extract()函数只会将值赋给变量,而$ apple就是这样。这意味着$ apple将在函数中输出,但$ ball和$ cat将是未定义的。

这是因为为了让extract()知道要为变量命名的内容,数组中必须有一个键。

为此,您需要每次都手动指定数组中的键:

$apple = 6;
$ball = 2;
$cat = 3;
$data = ["apple" => $apple, "ball" => $ball, "cat" => $cat];

// Now, extracting from $data creates the variables we need...
// Unsetting the $apple, $ball, and $cat variables 
// allows us to see that extract is recreating them.
unset($apple, $ball, $cat);
extract($data);
echo $apple, $ball, $cat;

或者您需要检查$ ball和$ cat变量以查看它们是否为数组。如果它们是数组,则可以在数组中使用它们的键,以便extract()知道它为其创建的变量命名的内容。您是否需要动态确定变量是否已经有一个键(是一个数组),还是这个?

编辑:不应该使用extract()。实际上,您应该创建一个类并将该数据存储在类中。然后,加载该类将为您提供此信息。 extract()是一种危险而凌乱的野兽。

答案 1 :(得分:0)

另一个答案。重点仍然是相同的,如果你有一个混合内容数组,请不要使用extract()

function foo($data){
    extract($data);
    echo "<br />apple:" . (isset($apple)?$apple:$data[0]);
    echo "<br />ball:" . (isset($ball)?$ball:$data[1]);
    echo "<br />cat:" .  (isset($cat)?$cat:$data[2]);
}

你可以在这里看到陷阱。如果数据具有更多或更少的索引,或者订单不正确,您将获得失败的索引或不正确的值。