php - 提取关联数组
php - Extract an associative array
我正在尝试提取混合关联数组,例如:
<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
数组只能是数字数组、只能是关联数组或两者兼而有之。如果数组元素缺少索引,它应该与变量相同。
这在您的函数中不起作用,因为 $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() 知道如何命名它创建的变量。是否需要动态判断一个变量是否已经有key(是数组),还是这样就够了?
编辑:这不应该用 extract() 来完成。实际上,您应该创建一个 class 并将此数据存储在 class 中。然后,加载 class 将为您提供此信息。 extract() 是一个危险而混乱的野兽。
另一个答案。重点还是一样,如果你有一个混合内容的数组,不要使用 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]);
}
你可以在这里看到陷阱。如果数据有更多或更少的索引,或者顺序不正确,你将得到一个失败的索引或不正确的值。
我正在尝试提取混合关联数组,例如:
<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
数组只能是数字数组、只能是关联数组或两者兼而有之。如果数组元素缺少索引,它应该与变量相同。
这在您的函数中不起作用,因为 $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() 知道如何命名它创建的变量。是否需要动态判断一个变量是否已经有key(是数组),还是这样就够了?
编辑:这不应该用 extract() 来完成。实际上,您应该创建一个 class 并将此数据存储在 class 中。然后,加载 class 将为您提供此信息。 extract() 是一个危险而混乱的野兽。
另一个答案。重点还是一样,如果你有一个混合内容的数组,不要使用 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]);
}
你可以在这里看到陷阱。如果数据有更多或更少的索引,或者顺序不正确,你将得到一个失败的索引或不正确的值。