无法访问 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 记得更新它 ;)
有一个由 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 记得更新它 ;)