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[', '&');
?>
我們很喜歡追求高深的技術,但往往忽略了一些簡單的技術,以至於設計出來的程序,總是不盡人意。。。
其實,技術是在於我們平時的積累,多寫,多思考,多領悟。。。