2016-11-29 23 views
4

有从POST数据 $this->log->write(print_r($array , true));不能存取权限数组值在PHP

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'];访问数组值的问题它是空做出了PHP数组。

对不起,问题看起来,但它不是。使用数组之前没有问题。也试过这个以及$array["signature"];$array->signature;空退回。 请帮助

+1

plz在你的问题中放一个'var_export($ array)',让我们看看到底是什么你var内容,或者'var_dump($ array)'。它也看起来你正在使用一个框架,它是哪一个? – Bobot

+0

请提供填写'$ array'变量的确切代码。 – Learner

+0

用var_export更新的问题 –

回答

1

正如你所看到的,你的密钥与\0莫名其妙地追加(这是结束串字符Ç如果我的记忆是好的)

这就是为什么当你尝试收集密钥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:消毒键重新关联到值

EDIT

实测出为什么...至少如果你使用PHP7

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

+0

谢谢@Bobot。我有PHP版本7.0.9 –

+1

@ S.M.Nat thx,将检查开发团队是否知道这一点:) – Bobot

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']; 

它不需要两个步骤进行消毒和分配。它在一个工作。

我希望它能帮助