我想知道php中extract()函数和关联数组()函数之间的区别是什么。我在哪里使用呢?
$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]";
,那么我得到的是相同的结果,但是有什么区别呢?
答案 0 :(得分:0)
通常我会说不要使用提取物。
通常最好将所有值保留在数组内,因为您可以循环数组。
对于变量,您不知道通过提取创建了多少个变量。是数组中只有一个值还是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%控制权的阵列使用提取。
答案 1 :(得分:0)
我同意@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
是一个数组函数,旨在处理数组。而关联数组是一个数组(有序映射)!