http_build_query在PHP5中是一个很常用的函数,用来生成URL编码的查询字符串。今天让项目组的几个同事设计一个http_build_query的替代函数,目的是让他们熟悉一下递归及URL查询字符串中特殊字符的处理两个知识点,他们很快都做出来了,遗憾的是,设计得并没有我预期的理想。
这是我自己后面写的一个:
<?php
/**
* http_build_query
* @param array/object $queryData 查询数据
* @param string $numericPrefix 数字索引时附加的Key前缀
* @param string $argSeparator 参数分隔符(默认为&)
* @param string $keyPrefix Key前缀(供内部递归时用)
* @return string
*/
function http_build_query2($queryData, $numericPrefix = '', $argSeparator = '&', $keyPrefix = '') {
$arr = array();
foreach ($queryData as $key => $val) {
if ($val === NULL) {
continue;
}
if (!is_array($val) && !is_object($val)) {
if (is_bool($val)) {
$val = $val ? 1 : 0;
}
if ($keyPrefix === '') {
if (is_int($key)) {
$arr[] = $numericPrefix . urlencode($key) . '=' . urlencode($val);
} else {
$arr[] = urlencode($key) . '=' . urlencode($val);
}
} else {
$arr[] = urlencode($keyPrefix . '[' . $key . ']') . '=' . urlencode($val);
}
} else {
if ($keyPrefix === '') {
$newKeyPrefix = $key;
} else {
$newKeyPrefix = $keyPrefix . '[' . $key . ']';
}
$arr[] = call_user_func_array(__FUNCTION__, array($val, $numericPrefix, $argSeparator, $newKeyPrefix));
}
}
return implode($argSeparator, $arr);
}
$arr = array(
'string1' => 'hello world',
'string2' => '中国 深圳',
'int' => 9527,
'float' => 9999.88,
'true' => true,
'false' => false,
'1.2' => 'a',
1 => 'A',
-1 => 'B',
'array' => array(
'key' => 'val',
2 => array(
'A' => 'a',
3 => '33',
'user' => array(
'name' => 'Lucy',
'age' => 25,
'set' => 'female',
)
)
),
'null' => NULL,
);
echo http_build_query($arr, 'prefix[', '&');
echo '<br />';
echo '<br />';
echo http_build_query2($arr, 'prefix[', '&');
?>
我们很喜欢追求高深的技术,但往往忽略了一些简单的技术,以至于设计出来的程序,总是不尽人意。。。
其实,技术是在于我们平时的积累,多写,多思考,多领悟。。。