无法访问 php 中的数组值

Can not acces array value in php

有一个由 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' . "[=11=]" . '' => '*/*',
'accept-encoding' . "[=11=]" . '' => 'gzip, deflate',
'signature' . "[=11=]" . '' => '37df88b6f845c21b1cda84cf3d3b94b0b15759b74f7387ceb0e9c8a6247c211f',
'connection' . "[=11=]" . '' => 'keep-alive',
'content-length' . "[=11=]" . '' => '610',
'user-agent' . "[=11=]" . '' => 'python-requests/2.10.0',
)var_export

我无法访问数组值的问题$array['signature'];它是空的。

抱歉,问题看起来很无聊,但事实并非如此。之前使用数组没问题。也试过这个 $array["signature"]; $array->signature; 空返回。 请帮忙

您可以通过以下方式访问它:

$array["signature[=10=]"];

"[=12=]" 被称为 "NULL character",即使它在输出数组时不可见,但在访问索引时会有所不同。

这就是为什么 "signature" 和 "signature[=32=]" 不一样,即使它们都会输出 'signature' 因为后面的一个有 10 个字符,而前一个只有 9 个,这使得它在使用时有所不同作为索引。

如果你熟悉 C 那么你可以从那里参考 "[=12=]" 用于结束一个字符串否则变量被认为是字符数组而不是字符串。

正如另一个答案中给出的那样,密钥清理可以是另一种选择。但我宁愿使用 foreach 来这样做:

foreach($array as $key=>$val){unset($array[$key]);$array[trim($key)] = $val;}
echo $array['signature'];

清理和分配不需要两个步骤。它合二为一。

希望对你有帮助

如您所见,您的密钥以某种方式附加了 [=11=](如果我没记错的话,这是 C 中的结束字符串字符)

这就是为什么当您尝试收集密钥 signature 时什么也没有,因为密钥是 signature[=13=]

所以,你有两个解决方案,第一个是调用 $array['signature' . "[=14=]"] 第二个是进行数组键清理。

像这样:

$keys = array_map(function($key){ return trim($key); }, array_keys($array));
$array = array_combine($keys, array_values($array));
  • 第 1 步:trim 所有键
  • 第 2 步:将经过清理的键与值重新关联

编辑

找出原因...至少如果您使用 PHP7

事实上,如果您 return 来自函数的数组,这将在每个数组键的末尾添加空字节。请参阅 github 问题 https://github.com/CopernicaMarketingSoftware/PHP-CPP/issues/248 顺便说一句,我猜你的 PHP7 版本是旧的 :p 记得更新它 ;)