2010-08-19 108 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