extract()

1. 定义

该函数与compact()函数相反,它将数组中的每个元素被转为对应的变量,其中数组的键名作为变量名,键值作为对应键名的变量值。 返回成功转化的变量的数量。

2. 语法

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

3. 参数说明

参数 可选性 数据类型 描述
$array 必需 数组 将被转换键值对的关联数组
$flags 必需 常量 对待非法/数字和冲突的键名时的处理方式,默认为EXTR_OVERWRITE
$prefix 必需 字符串 前缀,对待非法/数字和冲突的键名时可能会加上前缀以避免冲突或出错,会在前缀末尾自动加上下划线

其中,$flags有以下几个可选值:

  • EXTR_OVERWRITE:默认值。如果存在冲突(在使用该函数之前已定义同名变量),就覆盖已定义的同名变量
  • EXTR_SKIP:如果存在冲突,就跳过该键值对,不覆盖已定义的同名变量
  • EXTR_PREFIX_SAME:如果存在冲突,就为该键值对的键名加上前缀
  • EXTR_PREFIX_ALL:不论存不存在冲突,给所有的键名都加上前缀
  • EXTR_PREFIX_INVALID:只在键名为数字或非法值时加上前缀
  • EXTR_IF_EXISTS:仅覆盖存在冲突的同名变量,其余键值对将不处理(不创建为变量)
  • EXTR_PREFIX_IF_EXISTS:如果存在冲突,只创建加了前缀的变量,其余键值对不处理
  • EXTR_REFS:该标记意为将变量作为引用提取

4. 示例

<?php

// extract()
// 将数组中的每个元素被转为对应的变量,其中数组的键名作为变量名,键值作为对应键名的变量值

// 数字索引数组,除非使用 EXTR_PREFIX_ALL 或者 EXTR_PREFIX_INVALID 才能产生结果
$arr = ['极速教程', 'https://www.jisuapi.com/', '18888888888'];

// 给每个变量名都加上前缀 prefix_ (自动添加下划线)
extract($arr, EXTR_PREFIX_ALL, 'prefix');
var_dump($prefix_1);// 输出:string(24) "https://www.jisuapi.com/"

$arr = [
    'name'=>'极速教程',
    'host'=>'https://www.jisuapi.com/',
    'contact'=>'18888888888'
];// 关联数组
$name = '一个不愿意透露姓名的女子';
$res = extract($arr, EXTR_PREFIX_SAME, 'prefix');// 如果有冲突,就加上前缀
var_dump($name);// 输出:string(36) "一个不愿意透露姓名的女子"
var_dump($prefix_name);// 输出:string(12) "极速教程"
var_dump($res);// 输出:int(3)

$arr = [
    'name'=>'极速教程',
    'host'=>'https://www.jisuapi.com/',
    'contact'=>'18888888888'
];// 关联数组
$res = extract($arr, EXTR_PREFIX_SAME, 'prefix');// 没用引用提取参数 EXTR_REFS
$arr['contact'] = '我改变了这个值';
var_dump($contact);// 输出:string(11) "18888888888"

$arr = [
    'name'=>'极速教程',
    'host'=>'https://www.jisuapi.com/',
    'contact'=>'18888888888'
];// 关联数组
$res = extract($arr, EXTR_REFS, 'prefix');// 加上引用提取参数 EXTR_REFS
$arr['contact'] = '我改变了这个值';
var_dump($contact);// 输出:string(21) "我改变了这个值"

5. 延展阅读

  • compact():返回一个将参数列表中的参数名作为键名、与参数名同名的变量的值作为对应的键值的数组
  • list():将数组中的值赋给指定变量