Question. 问题
form 表单通过 post 的方式能够向后台传输大量的数据,这些数据以数组的形式被封装在 $_POST 中,如:
$_POST = array(
'id' => 1,
'code' => 'shorh',
'cat_id' => 55,
'name' => '防晒霜',
'brand_id' => 23,
);
或者是 URL 通过 get 的方式传参,数据以数组的形式被封装在 $_GET 中,比如 URL 为http://localhost/demo/extract/demo.php?a=1&b=2
:
$_GET = array (
'a' => 1,
'b' => 2
);
正常的我们解析这些数据,需要:
$id = $_POST['id'];
$code = $_POST['code'];
$cat_id = $_POST['cat_id'];
$name = $_POST['name'];
$brand_id = $_POST['id'];
这样的手工解析很麻烦,有没有什么方法能够处理这些数据呢?
extract() 方法可用于将数组展开,键名作为变量名,元素值为变量值,简单的说,就是能够直接将 $_POST
和 $_GET
中的变量解析出来,不需要我们手工赋值处理。
Solution. 解决
<?php
error_reporting(0);
print_r($_POST);
echo "<br>";
extract($_POST);
echo("\$username = ".$username."<br>");
echo("\$password = ".$password."<br>");
?><!DOCTYPE html>
<html>
<head>
<title>ExtractDemo</title>
<meta charset="utf-8">
</head>
<body>
<!-- 测试代码 -->
<form method="post">
<input type="text" name="username" value="<?php echo($username)?>">
<input type="password" name="password" value="<?php echo($password)?>">
<input type="submit" >
<br>输入文字
</form>
<!-- 说明 -->
<h4>1. extract()有什么用?</h4>
它的主要作用是将数组展开,方便对数组的操作,比方说,可以很方便的提取$_POST或者$_GET的元素,对表单提交上来的内容不用一一赋值。
<h4>2. extract()怎么用?</h4>
键名作为变量名,元素值为变量值
</body>
</html>
对于 post上来的数据通过extract($_POST);
解析,我们就可以直接通过变量的方式使用了。
Extension. 扩展
extract() 函数还有两个扩展参数,用来指定在一些特殊情况下(比如变量名重名冲突了之类),怎么处理这些变量,这些在平时开发中较少遇到,大家作为了解:
<?php
/* 假定 $var_array 是 wddx_deserialize 返回的数组*/
$size = "large";
$var_array = array(
"color" => "blue",
"size" => "medium",
"shape" => "sphere");
extract($var_array, EXTR_PREFIX_SAME, "wddx");
echo "\$color = $color<br>";
echo "\$size = $size<br>";
echo "\$shape = $shape<br>";
echo "\$wddx_size = $wddx_size<br>";
?><!DOCTYPE html>
<html>
<head>
<title>ExtractDemo</title>
<meta charset="utf-8">
</head>
<body>
<!-- 说明 -->
<div>
<div style="font-weight: 700;">EXTR_OVERWRITE</div>
<div >如果有冲突,覆盖已有的变量。</div>
</div>
<div>
<div style="font-weight: 700;">EXTR_SKIP</div>
<div >如果有冲突,不覆盖已有的变量。</div>
</div>
<div>
<div style="font-weight: 700;">EXTR_PREFIX_SAME</div>
<div >如果有冲突,在变量名前加上前缀 prefix 。</div>
</div>
<div>
<div style="font-weight: 700;">EXTR_PREFIX_ALL</div>
<div >给所有变量名加上前缀 prefix 。</div>
</div>
<div>
<div style="font-weight: 700;">EXTR_PREFIX_INVALID</div>
<div >仅在非法/数字的变量名前加上前缀 prefix 。</div>
</div>
<div>
<div style="font-weight: 700;">EXTR_IF_EXISTS</div>
<div >仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。可以用在已经定义了一组合法的变量,然后要从一个数组例如 $_REQUEST 中提取值覆盖这些变量的场合。本标记是 PHP 4.2.0 新加的。</div>
</div>
<div>
<div style="font-weight: 700;">EXTR_PREFIX_IF_EXISTS</div>
<div >仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。</div>
</div>
<div>
<div style="font-weight: 700;">EXTR_REFS</div>
<div >将变量作为引用提取。这有力地表明了导入的变量仍然引用了 var_array 参数的值</div>
</div>
<div>
<div style="font-weight: 700;">EXTR_PREFIX_INVALID</div>
<div >仅在非法/数字的变量名前加上前缀 prefix 。</div>
</div>
</body>
</html>