PHP

extract

extract

(PHP 4, PHP 5, PHP 7)

extract - 从数组中导入变量到当前符号表中

描述

int extract ( array &$array [, int $flags = EXTR_OVERWRITE [, string $prefix = NULL ]] )

将数组中的变量导入当前符号表中。

检查每个密钥以查看它是否具有有效的变量名称。它还检查与符号表中现有变量的冲突。

参数

array

一个关联数组。此函数将键作为变量名称和值作为变量值处理。对于每个键/值对,将创建在当前符号表中的变量,但须flagsprefix参数。

您必须使用关联数组; 数字索引的数组不会产生结果,除非您使用EXTR_PREFIX_ALLor EXTR_PREFIX_INVALID

flags

处理无效/数字键和冲突的方式由提取决定flags。它可以是以下值之一:

EXTR_OVERWRITE 如果发生冲突,请覆盖现有变量。 EXTR_SKIP 如果发生冲突,请勿覆盖现有变量。 EXTR_PREFIX_SAME 如果发生冲突,请在变量名前加上prefixEXTR_PREFIX_ALL 用所有变量名前缀prefixEXTR_PREFIX_INVALID 只能使用前缀无效/数字变量名称prefixEXTR_IF_EXISTS 如果它已经存在于当前符号表中,则只覆盖该变量,否则不执行任何操作。例如,这对于定义有效变量列表非常有用,然后仅提取您在$ _REQUEST之外定义的那些变量。 EXTR_PREFIX_IF_EXISTS 如果当前符号表中存在相同变量的非前缀版本,则只创建前缀变量名称。 EXTR_REFS 提取变量作为参考。这实际上意味着导入变量的值仍然引用array参数的值。您可以单独使用此标志,也可以通过“或”将它与任何其他标志组合在一起flags

如果flags没有指定,则认为是EXTR_OVERWRITE

prefix

需要注意的是prefix只需要如果flagsEXTR_PREFIX_SAMEEXTR_PREFIX_ALLEXTR_PREFIX_INVALIDEXTR_PREFIX_IF_EXISTS。如果前缀结果不是有效的变量名称,则它不会导入到符号表中。前缀通过下划线字符自动从数组键中分离出来。

返回值

返回成功导入符号表的变量数。

例子

示例#1 extract()示例

extract()的一个可能用途是将符号表导入wddx_deserialize()返回的关联数组中包含的变量。

<?php /* Suppose that $var_array is an array returned from    wddx_deserialize */ $size = "large"; $var_array = array("color" => "blue",                    "size"  => "medium",                    "shape" => "sphere" extract($var_array, EXTR_PREFIX_SAME, "wddx" echo "$color, $size, $shape, $wddx_size\n"; ?>

上面的例子将输出:

blue, large, sphere, medium

$ size没有被覆盖,因为我们指定了EXTR_PREFIX_SAME,导致$ wddx_size被创建。如果EXTR_SKIP被指定,那么$ wddx_size甚至不会被创建。EXTR_OVERWRITE会导致$ size的值为“medium”,并且EXTR_PREFIX_ALL会导致名为$ wddx_color,$ wddx_size和$ wddx_shape的新变量。

笔记

警告

不要对不受信任的数据使用extract(),如用户输入(例如$ _GET,$ _FILES等)。如果你这样做,例如,如果你想暂时运行依赖于register_globals的旧代码,请确保你使用了其中一个非覆盖flags值,例如,EXTR_SKIP并且知道你应该按照在php.ini中的variables_order中定义的相同顺序来提取。

注意:如果您仍然有register_globals并且它已打开,如果您在$ _FILES上使用extract()并指定EXTR_SKIP,您可能会对结果感到惊讶。 警告 这不是建议的做法,只有在这里记录完整性。不赞成使用register_globals,并调用extract()对于不可信数据如$ _FILES,如上所述,存在潜在的安全风险。如果遇到此问题,这意味着您至少使用了两种不良编码做法。<?php / \ *假设$ testfile是文件上传输入的名称,并且该寄存器\ _globals已打开。\ * / var \ _dump($ testfile); 提取($ \ _ FILES,EXTR \ _SKIP); 无功\ _dump($ testfile的); VAR \ _dump($ testfile的[ 'TMP \ _name']); (14)“/ tmp / phpgCCPX8”array(5){“name”=> string(10)“somefile.txt”“type”=> string(24) “tmp_name”=> string(14)“/ tmp / phpgCCPX8”“error”=> int(0)“size”=> int(4208)} string(14)“/ tmp / phpgCCPX8”application / octet-stream“ “但是,register_globals已打开,当调用extract()时,$ testfile已存在于全局范围中。由于EXTR_SKIP被指定,$ testfile不会被$_FILES数组的内容覆盖,因此$ testfile仍然是一个字符串。因为可以使用数组语法访问字符串,并且非数字字符串tmp_name被解释为0,所以PHP将$ testfile'tmp_name'视为$ testfile0。