2016-11-29 62 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']; 

它不需要兩個步驟進行消毒和分配。它在一個工作。

我希望它能幫助