在 php 中,提取 () 函数和关联数组有什么区别?



我想知道 extract() 函数和 php 中的关联数组 () 函数有什么区别。我在哪里使用它?

$state = array("AS"=>"ASSAM", "OR"=>"ORRISA", "KR"=>"KERELA"); 
extract($state); 
echo"$AS is $AS <br/>n$KR is $KR <br/>n$OR is $OR <br/>";

如果我正在编写 echo"$state[AS]";而不是这一行,那么我得到的结果相同,但有什么区别?

一般来说,我会说不要使用提取。
通常最好将所有值保留在数组中,因为您可以循环数组。

对于变量,您不知道通过提取创建了多少变量。它是数组中的一个值还是 50?
如果它在数组中,您可以计数和循环它们,在变量中您需要测试是否设置了每个变量。

如果您不幸,使用提取也会覆盖您的变量。

// Some calculations result in a price
$price = 500;
// Now you get an array from user input or json and extract it
$array = ["something" => "here", "price" => 10];
extract($array);
// Extracting overwrites your $price with value 10!
echo $price; // 10

假设我们再次使用上述场景,但没有提取。

// Some calculations result in a price
$price = 500;
// Now you get an array from user input or json
$array = ["something" => "here", "price" => 10];

echo $price; // 500
echo $array['price']; // 10

现在我们同时有了数组值和您的值。
没有什么是妥协的,因为我们控制着价值观的去向。
但是一旦你使用提取物,你真的释放了一切,只能希望最好。

TL/DR;

不要使用提取。如果您确实需要/想要使用它,则仅在您自己拥有 100% 控制的数组上使用数据提取。

我同意@Andreas给出的答案,即尽可能避免使用extract,因为您最终可能会覆盖您的变量。但是,答案中未提及的一件事是,您可以避免使用EXTR_PREFIX_SAME标志覆盖变量。

$price = 500;
$quantity = 1;
$array = ["something" => "here", "price" => 10, "quantity" => 2];
extract($array, EXTR_PREFIX_SAME, 'new');
echo $price; // 500
echo $something; // here
echo $quantity; // 1
echo $new_price; // 10
echo $new_quantity // 2

当然,对于一个大数组,这可能会让您想知道哪些变量(如果有的话)被分配了前缀。您可以创建这些变量的数组以找出...

print_r(array_filter(get_defined_vars(), function($key) {
if(substr($key, 0, 4) == 'new_') return 1;
}, ARRAY_FILTER_USE_KEY));
// output
Array
(
[new_price] => 10
[new_quantity] => 2
)

....或循环获得相同的结果。当然,如果你真的很倒霉,你仍然可能最终用这种技术覆盖你的变量!

要记住的一件事是,extract()只会在当前范围内创建或覆盖变量。这意味着您可以在本地范围内完成所需的工作。

function getBillsInfo($aboutBill) {
extract( $aboutBill);
echo ("I'm " . $firstName); // I'm Bill
}
$firstName = 'Bob';
$aboutBill = [
'firstName' => 'Bill',
'surname' => 'Mcgill',
'job' => 'grill',
'location' => 'seville',
];
getBillsInfo($aboutBill);
echo '<pre>' , ("I'm still " . $firstName); // I'm still Bob

最终,我确实认为extract有它的位置,但你需要小心使用它。

直接回答"php 中extract函数和关联数组有什么区别"这个问题有点像苹果和橙子的情况。extract是一个数组函数,旨在处理数组。而关联数组是一个数组(有序映射)!

最新更新