【问题标题】:What is the difference between extract () function and associatve array in php?php中的extract()函数和关联数组有什么区别?
【发布时间】:2019-09-15 17:21:30
【问题描述】:

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

【问题讨论】:

  • o.O what.. 没有关联数组函数.. 只是简单的数组。无论它们是数字索引还是标记,都定义了数组的类型..
  • extract函数可以调用on一个数组(关联数组会设置一个以索引为名字的变量,元素的值为数组的值)。使用extract() 可能不是一个好习惯。
  • “我在哪里使用这个”是什么意思? “这”到底是什么?

标签: php arrays variables extract


【解决方案1】:

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

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

如果你运气不好,使用 extract 也会覆盖你的变量。

// 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

现在我们有了数组值和你的值。
由于我们可以控制价值观的去向,因此没有任何事情受到损害。
但是一旦你使用extract,你真的释放了一切,只能寄希望于最好的。

TL/DR;

不要使用提取物。如果您确实需要/想要使用它,那么请仅在您拥有 100% 控制权的您自己的数组上使用 extract。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-03-31
      • 2015-01-31
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多