2009-06-04 75 views
8

當我在php中對一個associatve數組執行foreach循環時,它的執行順序就是它的定義順序。在PHP中保證關聯數組的順序嗎?

例如:

$arr = array("z" => "z", "a" => "a", "b" => "b"); 

foreach($arr as $key => val) 
    print("$key: $val\n"); 

輸出:

z: z 
a: a 
b: b 

鑑於

$arr = array("a" => "a", "b" => "b", "z" => "z"); 

輸出:

a: a 
b: b 
z: z 

所以我的問題是:這是行爲定義在規格級別?我能否有合理的把握在未來的PHP版本中不會更改此行爲?

回答

16

PHP Manual

PHP中的數組實際上是一個有序 地圖。地圖是將 值與鍵關聯的類型。這種類型的優化 幾種不同的用途;它可以被 視爲一個數組,列表(向量), 散列表(一個 映射的實現),字典,集合,棧, 隊列,可能更多。

數組是有序的。訂單可以是 ,使用各種排序 函數進行更改。

因此,您可以肯定(至少當前)訂單將保持不變。如果這種行爲發生變化,我會感到非常驚訝,因爲它有明確的說法,因此會有大量的代碼依賴它。

+0

+1報價勝過千言萬語。 ;) – Gumbo 2009-06-04 14:38:14

+0

謝謝!無論出於何種原因,我掩飾了這一點 - 可能當我仍然認爲它不適用於關聯數組時。 – Asuah 2009-06-04 14:42:14

0

這永遠不會改變。

+1

這些不是你正在尋找的變化。 *做絕地手浪* – 2012-04-26 15:02:36

0

因爲數組總是有序的,所以迭代數組的最簡單和最快的方法是從第一個元素到最後一個元素(因此沒有任何理由改變foreach())的行爲,您可以有理由相信這種行爲不會改變。

0

你的問題似乎來自Perl編程,其中「數組」不能保證你創建它們的順序。但是在PHP中,它一直都是有序的,而且一直是,否則很多代碼都會被破壞。