php中的list()和extract()函数

DATE: 2015-03-12 / VIEWS: 951

list() 函数用数组中的元素为一组变量赋值。

该函数只用于数字索引的数组,且假定数字索引从 0 开始。

例如:


<?php
$my_array = array("网站制作","程序开发","页面设计");
list($a, $b, $c) = $my_array;
echo "我们的业务包括:$a、 $b 和 $c。";
?>

有些时候,我们希望能够直接使用$name之类的变量名来直接访问数组中的键名为name的元素$array['name']。。此时我们可以使用PHP的内置函数extract()来实现抽取数组的键名作为变量名的功能。


<?php
$array = array('red' => '红色', 'blue' => '蓝色', 'green' => '绿色');
extract($array);    //调用extract()函数
echo $red.'<br/>';  //输出:红色
echo $blue.'<br/>'; //输出:蓝色
echo $green.'<br/>';    //输出:绿色
?>

在使用extract()函数之后,即使我们将数组$array销毁掉,我们仍然可以用$数组键名的形式来访问原数组中的数据。此外,各个变量的值在调用extract()函数时就已经确定了,不会再随着$array数组元素的值的改变而改变。

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
$red = '原来的红色'; //调用extract()之前已经存在的同名变量
$array = array('紫色', 'red' => '红色', 'blue' => '蓝色', 'green' => '绿色');
extract($array, EXTR_PREFIX_ALL, 'codeplayer'); //调用extract()函数,如果数组键名与现有变量存在冲突,则不覆盖现有变量。
echo $codeplayer_0.'<br/>'; //输出:紫色
echo $codeplayer_red.'<br/>';   //输出:红色
echo $codeplayer_blue.'<br/>';  //输出:蓝色
echo $codeplayer_green.'<br/>'; //输出:绿色
?>
总之在代码中,list()和extract()总有一些意想不到的实现。