2016-04-27 26 views
-2

假設我有這樣的關聯數組:PHP in-place會更改關聯數組中的單個鍵嗎?

$fruits = array(
'red' => 'strawberry', 
'blue' => 'banana', 
'green' => 'apple', 
); 

我想改變的關鍵blueyellow。請注意,我想更改一個,而不是一個值。我可以這樣做:

$fruits['yellow'] = $fruits['blue']; 
unset($fruits['blue']); 

但這會導致'yellow' => 'banana'處於數組的年底。如果我需要維護陣列的順序,那麼'yellow' => 'banana'與之前的'blue' => 'banana'處於相同的位置,我該怎麼做?

當然,我可以重建整個陣列,添加所有的鍵/值對,只需插入yellow而不是blue鍵,但這似乎是一個相當遲鈍的方式。

是否有更智能/更高效(最好是PHP本機)的方法來做到這一點?

+3

其實,你有什麼是正確的。這裏沒有訂單。這沒有任何區別。爲什麼你需要一個特定的順序?那麼你可以使用數字指數嗎? –

+0

你必須先了解php中的數組是如何工作的... http://php.net/manual/en/language.types.array.php –

+0

@PraveenKumar除非我誤解了,否則PHP數組是有序的? (也根據@GeorgePant的鏈接?)如果我做'implode('',$ fruits)''我總是得到相同的結果,即''草莓香蕉蘋果''按順序。 – RocketNuts

回答

0

下面的例子主要來自array_splice() for associative arrays

$newArray = array_slice($fruits, 0, $offset, true) + 
      array('yellow' => 'banana') + 
      array_slice($fruits, $offset, NULL, true); 

         print_r($newArray); 

採取如果我們知道的其中關鍵的「藍色」是偏移量,我們可以添加的黃色新的密鑰在它的位置。

所以在你的情況下,偏移量是1,因爲藍色是數組中的第二個鍵。

+0

這並不回答這個問題。告訴你的答案,這與這個問題有什麼關係? –

0

一個解決方案是使用array_keys鍵搞定,應用功能,以改變他們,只要你想,然後使用array_combine結合的價值觀的新鑰匙

$array = array_combine(array_map('replace_key', array_keys($fruits)), $fruits); 

    function replace_key($key){ 
    if($key=="blue") return "yellow"; 
    return $key; 
    } 

另一種解決方案是使用array_walk

$result = array(); 
    array_walk($fruits, function (&$value,$key) use (&$result) { 
     if($key=="blue") $key="yellow"; 
     $result[ $key ] = $value; 
     }); 
print_r($result); 

這樣做的另一個方法(可能更快)是使用foreach循環,如果你想有一個通用的解決方案只寫基於此代碼的簡單功能重建array.And:

$temp_array=array(); 

foreach($fruits as $key=>$value){ 

if($key=="blue") $key="yellow"; 

$temp_array[$key]=$value; 
} 

$fruits=$temp_array; 
0

的最快方法:

foreach($fruits as $key=>$value){ 
    If ($key==="blue"){ 
     $fruits["yellow"]= $value; 
     unset($fruits[$key]); 
    } 
} 
+0

比我在問題中發佈的內容更快(甚至更快)的速度如何? (我的意思是'$ fruits ['yellow'] = $ fruits ['blue']; unset($ fruits ['blue']);') – RocketNuts