2012-07-30 15 views
9

Ho un array come sottosostituire chiavi degli array con determinate rispettivi tasti

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

Ho un'altra matrice essendo chiavi per sostituire le informazioni chiave.

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

necessario sostituire tutte le chiavi di matrice $old a rispettivi valori nella matrice $keyReplaceInfo.

uscita dovrebbe essere così

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

ho dovuto farlo manualmente come di seguito. Mi aspetto un'opzione migliore. qualcuno può suggerire un modo migliore per realizzare questo?

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

So che questo può essere più semplice.

risposta

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

penso che questo sembra più facile di quello che si posa.

+0

'array_combine' funziona solo se le chiavi e i valori sono nell'ordine corretto e c'è una sostituzione per ogni chiave. (Ho considerato questa soluzione come me stessa). – Leigh

+0

In realtà l'unico problema di cui sopra è che non funzionerà se non c'è una sostituzione per ogni chiave. L'ordine non è un problema a causa di array_merge ($ old, $ keyReplaceInfoz). – Summoner

+0

Ci sono un paio di problemi, entrambi relativi al numero di elementi. Se la matrice di sostituzione contiene una chiave che non si trova nel vecchio array, ci sarà un avviso PHP (e nulla verrà sostituito). Se all'array di sostituzione manca una chiave dal vecchio array, la chiave nel vecchio array verrà sostituita con il proprio _value_ – Leigh

0
<?php 
$new = array(); 

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

} 
?> 
+0

Ciò non produce la matrice di output richiesta dall'OP. Si prega di controllare il codice prima di postare. – Leigh

+0

grazie, ho messo il mio codice rapidamente e non lo controllo. – chenio

-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

Questo cambierà il valore, non voglio cambiare il valore, voglio cambiare la chiave. –

1

Ho risolto questo stesso problema nella mia domanda, ma per la mia domanda $ keyReplaceInfoz agisce come whitelist- se la chiave non viene trovato, che intero elemento viene rimosso dalla matrice risultante, mentre la corrispondente lista bianca i tasti vengono tradotti nei nuovi valori.

Suppongo che si possa applicare questo stesso algoritmo magari con un codice meno totale mediante un uso intelligente di array_map (http://php.net/manual/en/function.array-map.php), che forse farà un altro lettore generoso.

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

Adattamento @ soluzione Shawn-k, qui è più codice più pulito utilizzando array_walk, sarà solo sostituirà tasti desiderati, naturalmente è possibile modificare secondo la vostra convenienza

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

Questa la soluzione che ho implementato per lo stesso argomento:

/** 
* 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

Come è diverso dal metodo mostrato nella domanda stessa? –

+0

Poiché questo metodo non necessita di una chiave sostitutiva per ogni chiave nell'array sorgente. Il metodo mostrato nella domanda darà un errore se nessuna chiave dell'array sorgente non esiste sull'array delle chiavi sostitutive –

+0

Hai ragione Juan, ma ero sicuro che avrò tutte le chiavi disponibili per la sostituzione. la domanda era di migliorare il metodo. il tuo metodo fa ancora lo stesso ciclo! –

Problemi correlati