我正在尝试提取一个混合关联数组,如:
<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
数组只能是数字,只能是关联或两者。如果数组元素未命中索引,则它应与变量相同。
答案 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]);
}
你可以在这里看到陷阱。如果数据具有更多或更少的索引,或者订单不正确,您将获得失败的索引或不正确的值。