欢迎各位兄弟 发布技术文章
这里的技术是共享的
在PHP中,有些时候,我们希望能够直接使用$name
之类的变量名来直接访问数组中的键名为name
的元素$array['name']。
。此时我们可以使用PHP的内置函数extract()
来实现抽取数组的键名作为变量名的功能。
对下面例子中的数组使用extract()
函数后,我们就可以直接使用$red
、$blue
、$green
来访问数组中的元素了:
在使用extract()
函数之后,即使我们将数组$array
销毁掉,我们仍然可以用$数组键名
的形式来访问原数组中的数据。此外,各个变量的值在调用extract()
函数时就已经确定了,不会再随着$array数组元素的值的改变而改变:
如果在调用extract()
函数之前就已经存在与数组键名重复的$red
变量时,这个时候PHP会怎么处理呢?默认情况下,PHP将会使用数组键名生成的新变量覆盖掉已经存在的同名变量。
如果我们不希望调用extract()
函数时直接覆盖掉现有变量,我们可以给函数extract()
传递第2个参数(可选参数)extract_type
。例如:
PHP函数extract()
的第2个参数extract_type
接受的值都是PHP内置的常量,并且这些常量名均以"EXTR_"开头。详情如下:
常量名 | 描述 |
---|---|
EXTR_OVERWRITE(默认值) | 如果有冲突,覆盖已有的变量。 |
EXTR_SKIP | 如果有冲突,不覆盖已有的变量。 |
EXTR_PREFIX_SAME | 如果有冲突,在变量名前加上前缀prefix 。 |
EXTR_PREFIX_ALL | 给所有变量名加上前缀prefix 。 |
EXTR_PREFIX_INVALID | 仅在非法/数字的变量名前加上前缀prefix 。 |
EXTR_IF_EXISTS | 仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。 举个例子,以下情况非常有用:定义一些有效变量,然后从$_REQUEST 中仅导入这些已定义的变量。 |
EXTR_PREFIX_IF_EXISTS | 仅在当前符号表中已有同名变量时,建立附加了前缀prefix 的变量名,其它的都不处理。 |
EXTR_REFS | 将变量作为引用提取。这有力地表明了导入的变量仍然引用了$array参数的值。可以单独使用这个标志或者在extract_type中用OR 与其它任何标志结合使用。 |
值得注意的是,如果extract()
函数的第2个参数为EXTR_PREFIX_SAME
、EXTR_PREFIX_ALL
、EXTR_PREFIX_INVALID
、EXTR_PREFIX_IF_EXISTS
时,extract()
函数还需要传入第3个参数prefix
。因为上述4个常量参数均需要定义如果变量名冲突时,需要附加什么样的变量前缀,最终抽取出来的变量名为$前缀_键名
。例如prefix
的值为「codeplayer」,那么上面的数组元素$array['red']
提取出来的变量名为$codeplayer_red
。下面我们看一个具体的例子:
PHP函数extract()
一般用于不适合直接访问数组变量的情况下,尤其是在诸如CodeIgniter等PHP框架中,可以使用extract()
函数来实现一些比较特别的功能。
来自 http://www.365mini.com/page/php-extract.htm
<?php
/*
php 把数组中的键名所为变量名键值作为变量
*/
$arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>5,'e'=>6);
//方法一,使用foreach循环实现
foreach($arr as $key=>$value){
$$key=$value;
}
echo $a;
//方法二,其实php早就已经实现了这个功能extract
extract($arr);
echo $a;
?>
来自 http://www.111cn.net/phper/php/53965.htm