http_build_query()点转换为下划线

时间:2013-08-05 12:02:32

标签: php

请检查以下数组:

Array([bunrey] => Array ([0] => 20130730181908615391000000)
      [mt.shasta] => Array ( 
        [0] => 20130708203742347410000000
        [1] => 20130213201456984069000000
        [2] => 20130712144459481348000000
      )
      [shingletwon] => Array
      (
        [0] => 20130801233842122771000000
      )
)

我想使用http_build_query()将此数组作为查询字符串发送, 使用http_build_query()后,我收到了以下字符串:

bunrey%5B0%5D=20130730181908615391000000&mt.shasta%5B0%5D=20130708203742347410000000&mt.shasta%5B1%5D=20130213201456984069000000&mt.shasta%5B2%5D=20130712144459481348000000&shingletwon%5B0%5D=20130801233842122771000000

正如您在将此查询字符串发送到其他文件后所看到的那样,我正在尝试检索。我回应了$_REQUEST对象:

Array (
[bunrey] => Array
    (
        [0] => 20130730181908615391000000
    )

[mt_shasta] => Array
    (
        [0] => 20130708203742347410000000
        [1] => 20130213201456984069000000
        [2] => 20130712144459481348000000
    )
[shingletwon] => Array
    (
        [0] => 20130801233842122771000000
    )
)

请检查其中一个密钥mr.shasta已更改为mr_shasta。 请问有人请为此提供任何解决方案。

2 个答案:

答案 0 :(得分:11)

这是标准的PHP行为。在POST请求中用作数组键时,点将以下划线转换。

来自documentation

  

变量名中的点和空格将转换为下划线。对于   例子<输入名称=“a.b”/>变成$ _REQUEST [“a_b”]。

唯一的解决方案是:在POST请求中使用它们时,在数组键中停止使用空格和/或点,否则,在接收的每个数组键上操作字符串替换。

$post = array();
foreach ($_POST as $key => $value)
$post[str_replace("_", ".", $key)] = $value;

请注意,上面的代码只能修复.(转换为_)而不是空格的问题。另外,如果您的原始密钥中有任何_,那么它也会转换为.(如评论中所指出的那样)。

如您所见,唯一真正的解决方案是避免使用.$_POST键中的空格。他们只是无法接收,而不是PHP(而不是我所知道的其他服务器端解决方案):你会丢失这些信息。

不,这不是限制或废话功能:这是一个编程指南。如果您使用的数组键名称比通常使用变量名称更多,那么您很可能在概念上做错了(我已经做了很多次)。

只是给你一个关于错误的例子:在之类的编程解决方案中(我认为,也是如此)POST / GET请求应该映射到函数中什么叫做“控制器”。这意味着如果你发送一个看起来像["myKey" => "myValue", "myOtherKey" => "someValue"]的POST,那么你应该有一个以键为参数的函数。

function(String myKey, String myOtherKey){ }

PHP没有默认的“on-top”框架(我知道)执行此操作:它允许您直接访问$ _POST。酷:但是这个玩具可以轻松打破。请谨慎使用。

答案 1 :(得分:0)

我可能在这里错了,但我已经复制了你正在做的事情并且发现它取决于你如何分配数组是否改变了这样的键:

//doesn't change to mt_shasta 
$array['bunrey'][0] = 20130730181908615391000000;
$array['bunrey']['mt.shasta'][0] = 20130708203742347410000000;
$array['bunrey']['mt.shasta'][1] = 20130708203742347410000000;
$array['bunrey']['mt.shasta'][2] = 20130708203742347410000000;
$array['bunrey']['shingletwon'][0] = 20130708203742347410000000;

//does change to mt_shasta
$array = array ( 
  '0'  => 20130730181908615391000000,
  'mt.shasta' => array ( 
    0 => 20130708203742347410000000,
    1 => 20130213201456984069000000,
    2 => 20130712144459481348000000,
  ),
  'shingletwon' => array
  (
    0 => 20130801233842122771000000,
  ),
);