`
yuanlanjun
  • 浏览: 1184442 次
文章分类
社区版块
存档分类
最新评论

PHP中http_build_query的替代函数实现

 
阅读更多

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[', '&');
?>

我们很喜欢追求高深的技术,但往往忽略了一些简单的技术,以至于设计出来的程序,总是不尽人意。。。

其实,技术是在于我们平时的积累,多写,多思考,多领悟。。。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics