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]);
}

你可以在这里看到陷阱。如果数据有更多或更少的索引,或者顺序不正确,你将得到一个失败的索引或不正确的值。