在php 5.4之前,默认会开启魔术引号,也就是请求一个php脚本时php会为$_GET,$_POST,$_COOKIE等的某些字体添加反斜线,相当于自动执行了addslashes()函数,这些字符包括单引号(‘),双引号(“),反斜线(\),NULL字符等,比如s’s会变成s\’s。据说这样做是为了安全,但实际我们使用这些变量里面的值时需要的是真实值,就需要stripslashes()一下,需要递归的对键和值都进行这么个操作。
一开始还不怎么明白是怎么个自动为$_GET等加上反斜线,于是我把magic_quotes_gpc打开,重启apache,定义$_GET[‘a’] = “s’s”;接着var_dump($_GET),值没变啊,没自动加上反斜线啊。实在是囧了,这里就说的自动添加,是这个请求传递过来的get/post参数里边自动添加,自已定义的是多少就多少,不会被添加。比如在1.html的表单input框,name=”s’s”,value=”s’s”,post提交到2.php,在2.php中打印$_POST,这时得到的是$_POST[“s\’s”] = “s\’s”,说的是这么个自动添加。
由于post过来的可能是多维数组,需要递归的对键和值同时进行stripslashes()操作。这该怎么写呢,我们看Yii Framework中的做法:
function myTrip(&$data)
{
if(is_array($data))
{
if(count($data) === 0)
{
return $data;
}
else
{
$keys = array_map('a', array_keys($data));
$data = array_combine($keys, array_values($data));//新数组
return array_map('myTrip', $data);//键已被处理,再处理值
}
}
else
{
return a($data);
}
}
function a($value)
{
return $value.'good';
}
$arr = array('key'=>'value', 'c'=>array('ddd'=>'eee'));
$arr = myTrip($arr);
echo '
';
var_dump($arr);
/*结果如下
array(2) {
["keygood"]=>
string(9) "valuegood"
["cgood"]=>
array(1) {
["dddgood"]=>
string(7) "eeegood"
}
}
*/
这里用a函数替代stripslashes,为键和值添加’good‘字符串。可以看到,它的做法是先取所有一级的键,通过函数处理后用处理后的键和之前的值组成新数组,将新数组作为array_map()参数递归调用自身,没错,是递归。对于递归一向是比较难理解的,前面文章有画过图,这里本来也打算画一下的,无奈自己在纸上画出来的用visio等软件就画不出来了,哎,还是算了。在这里或许想到不用递归用array_walk_recursive()调用a函数,其实是不行的,原因是array_walk_recursive只会把递归的把数组的值传过去,而不会把键传过去,因此二级之后的键就不会被处理了。这里myTrip里边的参数是否为引用不影响结果,引用的话听说会快一点,当然纯猜测。
递归虽然被说慢,但一些情况不用它,还真想不到什么办法。^.^