6

请检查以下数组:

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。你们能否为此提供任何解决方案。

4

2 回答 2

13

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

文档中:

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

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

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

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

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

不,这不是限制或废话功能:这是编程指南。如果你使用数组键名来做比通常使用变量名更多的事情,那么你很可能在概念上做了一些错误的事情(我也做过很多次)。

只是给你一个例子说明这是多么错误:在一些编程解决方案中,比如(我认为还有),POST/GET 请求应该映射到所谓的“控制器”中的函数上。这意味着如果你发送一个看起来["myKey" => "myValue", "myOtherKey" => "someValue"]你应该有一个将键作为参数的函数的 POST。

function(String myKey, String myOtherKey){ }

PHP 没有默认的“顶层”框架(据我所知):它允许您直接访问 $_POST。酷:但这个玩具很容易坏。谨慎使用。

于 2013-08-05T12:06:41.133 回答
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,
  ),
);
于 2013-08-05T12:40:06.913 回答