http_build_query()点转换为下划线

use*_*000 5 php

请检查以下数组:

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

我希望使用这个数组作为查询字符串发送,使用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
Run Code Online (Sandbox Code Playgroud)

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

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

[mt_shasta] => Array
    (
        [0] => 20130708203742347410000000
        [1] => 20130213201456984069000000
        [2] => 20130712144459481348000000
    )
[shingletwon] => Array
    (
        [0] => 20130801233842122771000000
    )
)
Run Code Online (Sandbox Code Playgroud)

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

Sat*_*nix 12

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

文档:

变量名中的点和空格将转换为下划线.例如,<input name ="ab"/>变为$ _REQUEST ["a_b"].

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

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

请注意,上面的代码只能解决.(转换为_)但不是空格的问题.此外,如果你_的原始密钥中有任何一个,那么它也将被转换.为(如评论中所指出的).

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

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

只是为了给你一个如何错误的例子:在一些编程解决方案中,例如(我认为,也是)POST/GET请求应该被映射到所谓的"控制器"中的函数.这意味着如果你发送一个看起来像["myKey" => "myValue", "myOtherKey" => "someValue"]你应该有一个函数,它接受键作为参数.

function(String myKey, String myOtherKey){ }
Run Code Online (Sandbox Code Playgroud)

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

  • [我最近的回答](http://stackoverflow.com/questions/18053835/when-post-a-var-contains-then-the-changed-to/18053899#18053899) (2认同)