无法在php中访问数组值

时间:2016-11-29 13:34:06

标签: php arrays object post associative-array

拥有一个由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;空了。 请帮忙

2 个答案:

答案 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));
  • 第1步:修剪所有键
  • 步骤2:将已清理的密钥重新关联到值

修改

找出原因......至少如果你使用的是PHP7

实际上,如果从函数返回一个数组,这将在每个数组键的末尾添加空字节。请参阅github问题https://github.com/CopernicaMarketingSoftware/PHP-CPP/issues/248 顺便说一下,我猜你的PHP7版本已经老了:请记住要更新它;)