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

我們很喜歡追求高深的技術,但往往忽略了一些簡單的技術,以至於設計出來的程序,總是不盡人意。。。

其實,技術是在於我們平時的積累,多寫,多思考,多領悟。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章