当前位置: 首页 > 技术随笔 > PHP使用extract()函数抽取数组键名作为变量名

PHP使用extract()函数抽取数组键名作为变量名

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

对下面例子中的数组使用extract()函数后,我们就可以直接使用$red$blue$green来访问数组中的元素了:

<?php
//设置编码为UTF-8,以避免中文乱码
header('Content-Type:text/html;charset=utf-8');

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

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

<?php
//设置编码为UTF-8,以避免中文乱码
header('Content-Type:text/html;charset=utf-8');

$array = array('red' => '红色', 'blue' => '蓝色', 'green' => '绿色');
extract($array);	//调用extract()函数
$array['red'] = '改变后的红色';		//调用之后再次改变数组元素的值
unset($array);	//调用之后销毁掉$array

echo $red.'<br/>';	//输出:红色
echo $blue.'<br/>';	//输出:蓝色
echo $green.'<br/>';	//输出:绿色
?>

如果在调用extract()函数之前就已经存在与数组键名重复的$red变量时,这个时候PHP会怎么处理呢?默认情况下,PHP将会使用数组键名生成的新变量覆盖掉已经存在的同名变量。

<?php
//设置编码为UTF-8,以避免中文乱码
header('Content-Type:text/html;charset=utf-8');
$red = '原来的红色';	//调用extract()之前已经存在的同名变量
$array = array('red' => '红色', 'blue' => '蓝色', 'green' => '绿色');
extract($array);	//调用extract()函数

echo $red.'<br/>';	//输出:红色
echo $blue.'<br/>';	//输出:蓝色
echo $green.'<br/>';	//输出:绿色
?>

如果我们不希望调用extract()函数时直接覆盖掉现有变量,我们可以给函数extract()传递第2个参数(可选参数)extract_type。例如:

<?php
//设置编码为UTF-8,以避免中文乱码
header('Content-Type:text/html;charset=utf-8');
$red = '原来的红色';	//调用extract()之前已经存在的同名变量
$array = array('red' => '红色', 'blue' => '蓝色', 'green' => '绿色');
//调用extract()函数,如果数组键名与现有变量存在冲突,则不覆盖已有变量。
extract($array, EXTR_SKIP);

echo $red.'<br/>';	//输出:原来的红色
echo $blue.'<br/>';	//输出:蓝色
echo $green.'<br/>';	//输出:绿色
?>

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_SAMEEXTR_PREFIX_ALLEXTR_PREFIX_INVALIDEXTR_PREFIX_IF_EXISTS 时,extract()函数还需要传入第3个参数prefix。因为上述4个常量参数均需要定义如果变量名冲突时,需要附加什么样的变量前缀,最终抽取出来的变量名为$前缀_键名。例如prefix的值为「codeplayer」,那么上面的数组元素$array['red']提取出来的变量名为$codeplayer_red。下面我们看一个具体的例子:

<?php
//设置编码为UTF-8,以避免中文乱码
header('Content-Type:text/html;charset=utf-8');
$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/>';	//输出:绿色
?>

PHP函数extract()一般用于不适合直接访问数组变量的情况下,尤其是在诸如CodeIgniter等PHP框架中,可以使用extract()函数来实现一些比较特别的功能。

2 0
我们认为: 用户的主要目的,是为了获取有用的信息,而不是来点击广告的。因此本站将竭力做好内容,并将广告和内容进行分离,确保所有广告不会影响到用户的正常阅读体验。用户仅凭个人意愿和兴趣爱好点击广告。
我们坚信:只有给用户带来价值,用户才会给我们以回报。
CodePlayer技术交流群1CodePlayer技术交流群1

帮朋友打一个硬广告:

P2P网贷系统(Java版本) 新年低价大促销,多年P2P技术积累,系统功能完善(可按需定制,可支持第三方存管、银行存管),架构稳定灵活、性能优异、二次开发快速简单。 另可提供二次开发、安装部署、售后维护、安全培训等一条龙服务。

外行看热闹,内行看门道。可以自信地认为,在系统设计上,比市面上的晓风、迪蒙、方维、绿麻雀、国融信、金和盛等P2P系统要好。
深圳地区支持自带技术人员现场考察源代码、了解主要技术架构,货比三家,再决定是否购买。

也可推荐他人购买,一旦完全成交,推荐人可获得实际售价 10% 的返现。
有意向者,详情请 点击这里 联系,工作时间立即回复。