PHP中的extract()函数和associatve数组有什么区别?

时间:2019-04-26 08:13:33

标签: php arrays variables extract

我想知道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]";,那么我得到的是相同的结果,但是有什么区别呢?

2 个答案:

答案 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 是一个数组函数,旨在处理数组。而关联数组是一个数组(有序映射)!