2012-11-27 52 views
2

我正在通過身份管理系統(基於SAML2.0)傳遞數組,該身份管理系統向我提供了一組數組中的用戶屬性。使用陣列密鑰中的冒號或如何避免冒號

身份提供商配置此數據的結構,我正在提供此服務(大得多的公司)。改變我收到這個數組的方式不在我的控制之下。

陣列到達我以這種形式(這是我所看到的,如果我print_r數組):

Array 
(
[http://longurl/surname] => Array ([0] => Smith) 
[http://longurl/firstname] => Array ([0] => John) 
); 

正如你所看到的,關鍵這個陣列陣列是一個URL(I」我確定他們有一個很好的理由?!)。但是,如果我試圖用這個陣列的工作,像這樣:

echo 'Hello Mr. '.$SAMLDATA[http://longurl/surname][0]; 

這是不行的,因爲冒號不是內部變量(或讓我讀)有效的字符。

逃離角色似乎不工作,任何想法我可以在這裏做什麼?非常感謝。

+0

如果您不引用它們,我懷疑您沒有啓用「error_reporting」。否則,你會看到一堆關於未知常數的通知,假定的字符串。 '的error_reporting(E_ALL); ini_set('display_errors',1);'總是在開發時。 –

+0

@MichaelBerkowski啊,好的謝謝你。如果我想用這樣的字符串定義一個數組,將會引用字符串的工作(用於測試目的?) – Gideon

+0

@MichaelBerkowski - 是的,我看到它會,這已經解決了我的問題。謝謝。我承認我不明白$ array [data]和$ array ['data']之間的區別 - 我已經看到堆棧中的人強烈地將引號標記爲不必要的 - 所以我擺脫了這種習慣,但我應該學習何時使用它們。再次感謝 - 如果你寫了一個簡短的答案,我會標記你。 – Gideon

回答

1

由於PHP的非整數數組鍵是字符串,它們必須引用爲字符串。如果你不引用它們,PHP會發出一個關於未定義常量的E_NOTICE,假設你打算使用一個字符串代替常量,並且如果你嘗試使用帶有冒號的數組鍵,就像這些URL一樣,這可能會導致致命的語法錯誤。

因此,要解決你的問題,你真的只需要正確引用數組鍵爲:

echo 'Hello Mr. '.$SAMLDATA['http://longurl/surname'][0]; 

注意,只有環境中,它是可以接受的引用字符串數組鍵是當內插在雙引號字符串中。例如:

$str = "This double-quoted string has an $array[key] value inside it"; 

對於像上面這樣簡單的數組值,您不需要在雙引號字符串中引用鍵。

但是,就您而言,您可能需要使用{}語法來訪問插入字符串中的這些URL鍵之一。當使用{}時,你的需要引用字符串數組鍵。一般來說,我總是建議使用{}語法陣列和對象值的,因爲它提高了可讀性:

// When using {} enclosures, you do need to quote the key 
$str = "This double-quoted string has an {$array['key']} value inside it"; 

周圍在雙引號字符串are documented here上述示例的各種規則。

+0

'$ str =「這個雙引號的字符串裏面有一個{$ array ['key']}值;' 這裏你引用了與你的解釋相反的關鍵字,這是一個單詞嗎?或者我誤解了......? – Gideon

+1

@Gideon注意它上面的註釋。當在{}內部時,你需要引用字符串。我會更多地澄清上面的段落,因爲它不夠明確。 –

+0

啊 - 謝謝你澄清,並指向我的文件,我會讀一讀。 – Gideon