PHP: array2url

我很喜歡用multi-dimensional array來傳送表單資料(印象中在ASP不能直接這樣用),可是這樣的東西在做分頁界面的時候很難還原成URL,所以就寫了一個array2url:
function array2url($arr,$main='') {
$tmp = array();
foreach($arr as $key=>$val) {
$prefix = $main ? sprintf('%s[%s]', $main, $key) : $key;
$tmp[] = is_array($val) ? array2url($val, $prefix) : "$prefix=$val";
}
return implode('&',$tmp);
}


範例: $abc = array(
'ohmyhoney' => array(
'recede' => 941505,
'tbex' => array(
'school' => 'nctu',
'department' => 'cs'
)
),
'bango' => 'banco'
);
echo array2url( $abc );

結果:ohmyhoney[recede]=941505&ohmyhoney[tbex][school]=nctu&ohmyhoney[tbex][department]=cs&bango=banco

所以之後就可以: $arr = $_GET['arr'];
unset( $arr['page'] );
for( $page = 1; $page <= $amount / $records_per_page; $page++ )
printf(
'<a href="http://www.blogger.com/webpage.php?%s&page=%d">第 %d 頁</a>',
htmlentities( array2url( $arr ) ),
$page,
$page
);

比較討厭的是因為寫成recursive function,所以連結的部份要符合W3C標準的話,要自己再加上一個htmlentities()
另外還有個狀況是如果是還原自$_GET的話仍可能和$_SERVER['REQUEST_URI']不一樣,如a[]=3會變成a[0]=3,不過好像就只是網址變長而已,並不影響PHP的運作(但是仍要小心網址因此而太長而超過HTTP的限制)

Update(2007-07-26 22:40):
不過之後darkhero直接踢破說PHP5之後其實有http_build_query()可以用(雖然因為RFC 1738的關係,空格的編碼方式不同)...orz

沒有留言: