拥有一个由POST数据构成的php数组
$this->log->write(print_r($array , true));
Array
(
[accept] => */*
[accept-encoding] => gzip, deflate
[signature] => 37df88b6f845c21b1cda84cf3d3b94b0b15759b74f7387ceb0e9c8a6247c211f
[connection] => keep-alive
[content-length] => 610
[user-agent] => python-requests/2.10.0
)
$this->log->write(var_export($array , true).'var_export');
array (
'accept' . "\0" . '' => '*/*',
'accept-encoding' . "\0" . '' => 'gzip, deflate',
'signature' . "\0" . '' => '37df88b6f845c21b1cda84cf3d3b94b0b15759b74f7387ceb0e9c8a6247c211f',
'connection' . "\0" . '' => 'keep-alive',
'content-length' . "\0" . '' => '610',
'user-agent' . "\0" . '' => 'python-requests/2.10.0',
)var_export
我无法使用$array['signature'];
访问数组值的问题是空的。
抱歉问题看起来很小但不是。之前使用数组并没有问题。尝试了这一点$array["signature"];
$array->signature;
空了。
请帮忙
答案 0 :(得分:1)
您可以按以下方式访问它:
$array["signature\0"];
"\0"
被称为"NULL character"
,即使它在输出数组时不可见,但在访问索引时会有所不同。
这就是为什么“签名”和“签名\ 0”不相同,即使它们都输出'签名',因为后者有10个字符,而前者只有9,这使得它在使用它作为索引时不同。
如果您熟悉C,那么您可以从那里获取参考,"\0"
用于结束字符串,否则变量被视为字符数组而不是字符串。
如另一个答案所述,钥匙的清理可能是另一种选择。但我宁愿使用foreach这样做:
foreach($array as $key=>$val){unset($array[$key]);$array[trim($key)] = $val;}
echo $array['signature'];
清理和分配不需要两个步骤。它合二为一。
我希望它有所帮助
答案 1 :(得分:1)
正如您所看到的,您的密钥会以某种方式附加\0
(如果我的记忆力良好,则为 C 中的结束字符串字符)
这就是为什么当你尝试收集密钥signature
时没有任何东西,因为密钥是signature\0
所以,你有两个解决方案,首先是调用$array['signature' . "\0"]
第二个是进行数组密钥清理。
像这样:
$keys = array_map(function($key){ return trim($key); }, array_keys($array));
$array = array_combine($keys, array_values($array));
修改强>
找出原因......至少如果你使用的是PHP7
实际上,如果从函数返回一个数组,这将在每个数组键的末尾添加空字节。请参阅github问题https://github.com/CopernicaMarketingSoftware/PHP-CPP/issues/248 顺便说一下,我猜你的PHP7版本已经老了:请记住要更新它;)