|
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 = '';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[] = http_build_query2($val, $numericPrefix, $argSeparator, $newKeyPrefix);}}return implode($argSeparator, $arr);}$arr = array('1.2' => 'a',1 => 'A','mm' => 'MM','array' => array('aa' => 'AA',2 => array('A' => 'a',3 => '33','xxx' => array('yyy' => 'YYY','zzz' => 'ZZZ',))),'qq' => array('cc' => 'AA',222 => 'MMMM','AA' => 'ABC',),'float' => 9999.88,'bool_true' => true,'bool_false' => false,'ssssssss' => NULL,);echo http_build_query($arr, 'prefix[', '&');echo '<br />';echo http_build_query2($arr, 'prefix[', '&');?> 我们很喜欢追求高深的技术,但往往忽略了一些简单的技术,以至于设计出来的程序,总是不尽人意。。。
其实,技术是在于我们平时的积累,多写,多思考,多领悟。。。 |
|
|