请检查以下数组:
Array([bunrey] => Array ([0] => 20130730181908615391000000)
[mt.shasta] => Array (
[0] => 20130708203742347410000000
[1] => 20130213201456984069000000
[2] => 20130712144459481348000000
)
[shingletwon] => Array
(
[0] => 20130801233842122771000000
)
)
我想使用CCD_ 1将此数组作为查询字符串发送,使用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
。你们能为此提供任何解决方案吗。
这是标准的PHP行为。点在POST请求中用作数组键时会转换为下划线。
来自文件:
变量名称中的点和空格将转换为下划线。对于示例<input name="a.b"/>变为$_REQUEST["a_b"]。
唯一的解决方案是:在POST请求中使用数组键时,停止在数组键中使用空格和/或点,否则,对接收到的每个数组键进行字符串替换。
$post = array();
foreach ($_POST as $key => $value)
$post[str_replace("_", ".", $key)] = $value;
请注意,上面的代码将只修复.
(转换为_
)的问题,而不修复空格。此外,如果您的原始密钥中有任何_
,它也将转换为.
(如注释中所指出的)。
正如您所看到的,唯一真正的解决方案是避免http_build_query()
0和$_POST
密钥中的空格。它们就是无法接收,PHP也无法接收(据我所知,其他服务器端解决方案也无法接收):您会丢失这些信息。
不,这不是一个限制或垃圾特性:这是一个编程指南。如果您使用数组键名称的方式超出了通常使用变量名称的方式,那么您很可能在概念上做了错误的事情(我也做过很多次)。
举个例子说明这有多错误:在一些编程解决方案中,比如asp.net-mvc(我认为还有codeigniter),POST/GET请求应该映射到所谓的"控制器"中的函数上。这意味着,如果您发送一个看起来像["myKey" => "myValue", "myOtherKey" => "someValue"]
的POST,那么您应该有一个将键作为参数的函数。
function(String myKey, String myOtherKey){ }
PHP没有默认的"顶级"框架(据我所知)可以做到这一点:它允许您直接访问$_POST。酷:但是这个玩具很容易坏。小心使用。
我可能错了,但我已经复制了你正在做的事情,并发现这取决于你如何分配数组,以及它是否像这样更改密钥:
//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,
),
);