2012-07-30 20 views
9

我有像下面與給定的各個鍵代替數組鍵

$old = array(
     'a' => 'blah', 
     'b' => 'key', 
     'c' => 'amazing', 
     'd' => array(
       0 => 'want to replace', 
       1 => 'yes I want to' 
      ) 
     ); 

我有具有鍵具有鍵信息來替換另一個陣列的陣列。

$keyReplaceInfoz = array('a' => 'newA', 'b' => 'newB', 'c' => 'newC', 'd' => 'newD'); 

我需要與各自的值,以取代在陣列$keyReplaceInfo陣列$old的所有密鑰。

輸出應該是這樣的

$old = array(
     'newA' => 'blah', 
     'newB' => 'key', 
     'newC' => 'amazing', 
     'newD' => array(
       0 => 'want to replace', 
       1 => 'yes I want to' 
      ) 
     ); 

我不得不如下做手工。我期待更好的選擇。任何人都可以提出更好的方法來實現這一點

$new = array(); 
foreach ($old as $key => $value) 
{ 
    $new[$keyReplaceInfoz[$key]] = $value; 
} 

我知道這可以更簡單。

回答

14
array_combine(array_merge($old, $keyReplaceInfoz), $old) 

我想,這看起來比你帶來什麼更容易。

+0

'array_combine'只有在鍵和值的順序正確時纔有效,並且每個鍵都有替換。 (我自己將此視爲一種解決方案)。 – Leigh 2012-07-30 14:10:53

+0

其實上述唯一的問題是,如果沒有替換每個密鑰,它將無法正常工作。排序不是問題,因爲array_merge($ old,$ keyReplaceInfoz)。 – Summoner 2012-07-30 14:17:57

+0

有幾個問題,都涉及元素的數量。如果替換數組包含不在舊數組中的鍵,則會有PHP警告(並且不會被替換)。如果替換數組缺少舊數組中的一個鍵,舊數組中的鍵將被替換爲它自己的_value_ – Leigh 2012-07-30 14:22:05

0
<?php 
$new = array(); 

foreach ($old as $key => $value) 
{ 
    $new[$keyReplaceInfoz][$key] = $value; 

} 
?> 
+0

這不會產生OP所要求的輸出數組。發佈前請檢查您的代碼。 – Leigh 2012-07-30 14:12:00

+0

謝謝,我把我的代碼很快,我不檢查它。 – chenio 2012-07-30 14:15:19

-1
<?php 
$old = array(
     'a' => 'blah', 
     'b' => 'key', 
     'c' => 'amazing', 
     'd' => array(
       0 => 'want to replace', 
       1 => 'yes I want to' 
      ) 
     ); 
$keyReplaceInfoz = array('a' => 'newA', 'b' => 'newB', 'c' => 'newC', 'd' => 'newD'); 

$new = array(); 

foreach ($old as $key => $value) 
{ 
    $newvalue = $keyReplaceInfoz[$key]; 
    $new[$key] = $newvalue; 
} 
print_r($new); 

?> 
+0

這將改變這個值,我不想改變這個值,我想改變這個值。 – 2012-07-31 10:19:12

1

我只是解決了我自己的應用程序同樣的問題,但我的應用程序$ keyReplaceInfoz的作用類似於whitelist-如果密鑰沒有發現,整個元素從產生的數組中刪除,而匹配白名單鍵會被轉換爲新的值。

我想你可以通過巧妙使用array_map(http://php.net/manual/en/function.array-map.php)來應用這種相同的算法,也許用更少的總代碼,這也許是另一個慷慨的讀者會做的。

function filterOldToAllowedNew($key_to_test){  
    return isset($keyReplaceInfoz[$key_to_test])?$keyReplaceInfoz[$key_to_test]:false; 
} 

$newArray = array(); 

foreach($old as $key => $value){ 
    $newkey = filterOldToAllowedNew($key); 
    if($newkey){ 
     $newArray[$newkey] = $value; 
    } 
} 

print_r($newArray); 
2

適應@余文樂-K的解決方案,下面是一個使用array_walk更清晰的代碼,它只會更換所需的按鍵,當然你也可以修改,按您的方便

array_walk($old, function($value,$key)use ($keyReplaceInfoz,&$old){ 
     $newkey = array_key_exists($key,$keyReplaceInfoz)?$keyReplaceInfoz[$key]:false; 
     if($newkey!==false){$old[$newkey] = $value;unset($old[$key]); 
     } 
    }); 

    print_r($old); 
0

這個問題的解決,我有針對同一主題實施:

/** 
* Replace keys of given array by values of $keys 
* $keys format is [$oldKey=>$newKey] 
* 
* With $filter==true, will remove elements with key not in $keys 
* 
* @param array $array 
* @param array $keys 
* @param boolean $filter 
* 
* @return $array 
*/ 
function array_replace_keys(array $array,array $keys,$filter=false) 
{ 
    $newArray=[]; 
    foreach($array as $key=>$value) 
    { 
     if(isset($keys[$key])) 
     { 
      $newArray[$keys[$key]]=$value; 
     } 
     elseif(!$filter) 
     { 
      $newArray[$key]=$value; 
     } 
    } 

    return $newArray; 
} 
+0

這與問題本身顯示的方法有何不同? – 2017-07-03 07:02:32

+0

因爲此方法不需要爲源數組中的每個鍵都有一個替換鍵。 如果在替換鍵陣列上不存在源陣列的任何鍵時,問題中顯示的方法將會出現一個錯誤 – 2017-07-03 12:26:19

+0

您是對的Juan,但我確信我將擁有可供替換的所有鍵。問題是改進方法。你的方法仍然執行相同的循環! – 2017-07-06 11:04:26