2012-07-25 49 views
2

不要緊,按什麼順序按鍵陣列中的陣列做一個array_merge,即會低於重寫第二個數組中的鍵第一個數組中的鍵:PHP array_merge鍵順序

array1 = array('username' => 'abc', 'level' => 'admin', 'status' => 'active'); 
array2 = array('level' => 'root', 'status' => 'active', 'username' => 'bcd'); 

?或者兩個數組中的鍵的順序必須相同?

+0

您可以通過簡單的保存自己5分鐘想出來 – 2013-12-12 19:02:37

回答

2

manual狀態回答這個問題:

用於合併一個或多個陣列一起的元件,使得一個值被附加到以前的一個的端部。它返回 生成的數組。

如果輸入數組具有相同的字符串鍵,則該鍵的後面的值 將覆蓋前一個。但是,如果數組 包含數字鍵,則後面的值不會覆蓋原始值 的值,但會被附加。

因此,如果第二個數組包含一些相同的鍵,第二個數組中的鍵將覆蓋第一個鍵中的鍵。

$array1 = array('username' => 'abc', 'level' => 'admin', 'status' => 'active'); 
$array2 = array('level' => 'root', 'status' => 'active', 'username' => 'bcd'); 

$new = array_merge($array1, $array2); 

print_r($new); 

輸出:

Array 
(
    [username] => bcd 
    [level] => root 
    [status] => active 
) 

所以你可以看到,從所述第二陣列的按鍵改寫從第一個相同的鍵;每個數組中的鍵的順序無關緊要。

0

這是一個替代解決方案,它允許使用模板數組來定義輸出順序。缺失字段填寫null或按指定填寫。在此示例中,firstlast字段填充了---

請注意上一個關於數字鍵的答案中突出顯示的文字。

function array_merge_template($array1, $array2, $template, $fill=null) { 
    $_template = array_fill_keys($template, $fill); 
    return array_intersect_key (array_replace ($_template, array_merge($array1, $array2)) , $_template); 
} 

輸入:

$array1 = ['username' =>'abc', 'level' =>'admin', 'status' =>'active', 'foo'=>'x']; 
$array2 = ['level' =>'root', 'status' =>'active', 'username' =>'bcd', 'bar'=>'y']; 
$template = ['first','level','foo','username','bar','status','last']; 

輸出:

/* array_merge($array1,$array2) */ 
[ 
    "username" => "bcd", 
    "level" => "root", 
    "status" => "active", 
    "foo"  => "x", 
    "bar"  => "y" 
] 

/* array_merge_template($array1,$array2,$template,'---') */ 
[ 
    "first" => "---", 
    "level" => "root", 
    "foo"  => "x", 
    "username" => "bcd", 
    "bar"  => "y", 
    "status" => "active", 
    "last"  => "---" 
]