【问题标题】:Query string processing查询字符串处理
【发布时间】:2010-08-19 16:20:13
【问题描述】:

在进行一些查询字符串处理时,我偶然发现了这一点:

<?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' 被视为数字键),但我不高兴我必须长期这样做。

一定有办法让它保持简单。您如何对查询字符串进行切片、切块和烹饪?

【问题讨论】:

    标签: php query-string


    【解决方案1】:

    考虑对数组使用 UNION 运算符

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

    【讨论】:

    • 对我来说很陌生!我会检查一下。唯一的问题是,如果一个键已经存在,那么它需要被新值覆盖。我会测试。
    • 噢!几乎!如果右侧的数组包含左侧数组中的键,则它将被忽略。确认!
    • 如有必要,尝试颠倒顺序:$out=array('9'=>'d')+$qs;取决于联合遇到匹配键时您想要的值
    【解决方案2】:

    你为什么不对一个数组做一个简单的循环并检查键是否存在?

    如果存在则更新值,否则添加一个新的数组元素。我这样做是为了避免此类问题。

    【讨论】:

      【解决方案3】:

      我正在使用 http_build_query() 函数。
      并且永远不要对查询字符串/任何请求变量使用数字键。

      【讨论】:

      • http_build_query() 稍后会出现在管道中。关于不在查询字符串中使用数字键的好建议,但我的模块需要通过非常严格的测试,其中包括会让你哭泣的东西;)
      • @zaf 我不会哭,但 PHP 会。
      【解决方案4】:

      问题在于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。这可能是也可能不是.

      【讨论】:

      • 为 parse_str 提供额外的参数不会产生创建局部变量的副作用(这就是手册所说的)。至于推入数组,我需要它更加动态:)
      • 而且@Mark Ba​​ker 的联合数组的方法会很好地工作,但我想提供一个不同的选项而不是复制;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 2022-01-24
      • 1970-01-01
      • 2013-01-27
      相关资源
      最近更新 更多