我同意@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 有它的位置,但你需要小心使用它。
直接回答“extract 函数和 php 中的关联数组有什么区别”这个问题有点像苹果和橘子的场景。 extract 是一个数组函数,旨在处理数组。而关联数组就是数组(有序映射)!