2010-08-19 145 views
4

雖然做了一些我偶然發現了這個查詢字符串處理:查詢字符串處理

<?php 
$in='a=6&b=7&8=c'; 
parse_str($in,$qs); 
$out=array_merge($qs,array('9'=>'d')); 
print_r($out); 
?> 

我們得到:

Array 
(
    [a] => 6 
    [b] => 7 
    [0] => c 
    [1] => d 
) 

相反的:

Array 
(
    [a] => 6 
    [b] => 7 
    [8] => c 
    [9] => d 
) 

我明白爲什麼會發生('8'和'9'被視爲數字鍵),但我不高興我必須漫長的這樣做。

必須有一種方法來保持它簡單。你如何切片,骰子和煮你的查詢字符串?

回答

1

UNION操作你爲什麼不只是做一個簡單的循環,在一個陣列和重點抽查存在與否?

如果它存在,則更新值,否則添加一個新的數組元素。這就是爲了避免像這樣的問題。

+0

可能是最安全的選擇! – zaf 2010-08-19 17:11:48

1

我正在使用http_build_query()函數。
從不使用數字鍵查詢字符串/任何請求變量。

+0

http_build_query()稍後在管道中。好的建議,不要在查詢字符串中使用數字鍵,但我的模塊需要通過非常嚴格的測試,其中包括會讓你哭的事情;) – zaf 2010-08-19 16:34:35

+2

@zaf我不會哭,但PHP會。 – 2010-08-19 16:44:45

1

的問題是,array_merge重新編號,數字鍵,以便他們從零開始(在合併之前,如果你var_dump$qs數組,你會發現有一個名爲8的關鍵)。要麼不使用數字鍵,或只是直接推到陣列而不是使用array_merge的:

$in = 'a=6&b=7&8=c'; 
parse_str($in,$qs); 
$out = $qs; 
$out[9] = 'd'; 

注意parse_str也有在局部範圍內設置變量的副作用,所以以後你解析你的查詢字符串,$a將是6並且$b將是7.這可能是也可能不是期望的。

+0

給parse_str賦予額外的參數沒有副作用(這就是手冊說的)創建一個局部變量。至於推入陣列,我會需要它更動態:) – zaf 2010-08-19 16:38:44

+0

@zaf你是對的,我一定錯過了。 – 2010-08-19 17:14:02

+0

@Mark Ba​​ker的聯合數組的方法可以很好地工作,但我想給出一個不同的選項,而不是重複;) – 2010-08-19 17:16:52

2

考慮使用數組

$out=$qs+array('9'=>'d'); 
print_r($out); 
+0

對我而言是新的!我會檢查出來的。唯一的一點是,如果一個密鑰已經存在,那麼它需要被新值覆蓋。我會測試。 – zaf 2010-08-19 16:36:00

+0

Oo!幾乎!如果右側的數組包含左側數組中的鍵,則會被忽略。確認! – zaf 2010-08-19 16:42:49

+0

如果需要,嘗試顛倒順序:$ out = array('9'=>'d')+ $ qs;取決於聯盟遇到匹配鍵時你想要哪個值 – 2010-08-19 19:15:31