2012-07-30 20 views
9

tengo una matriz, como a continuaciónreemplazar claves de matriz con las claves correspondientes dadas

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

tengo otra matriz que tiene las llaves para reemplazar los datos fundamentales.

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

tengo que sustituir todas las claves de serie $old con los valores respectivos en orden $keyReplaceInfo.

de salida debe ser así

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

que tenía que hacer manualmente de la siguiente manera. Estoy esperando una mejor opción. ¿Alguien puede sugerir una mejor manera de lograr esto?

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

Sé que esto puede ser más simple.

Respuesta

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

creo que esto parece más fácil de lo que usted plantea.

+0

'array_combine' solo funcionará si las claves y los valores están en el orden correcto, y hay un reemplazo para cada clave. (Miré esto como una solución yo mismo). – Leigh

+0

En realidad, el único problema con lo anterior es que no funcionará si no hay un reemplazo para cada tecla. El pedido no es un problema debido a array_merge ($ old, $ keyReplaceInfoz). – Summoner

+0

Hay un par de problemas, ambos relacionados con el número de elementos. Si la matriz de reemplazo contiene una clave que no está en la matriz anterior, habrá una advertencia de PHP (y no se reemplazará nada). Si a la matriz de reemplazo le falta una clave de la matriz anterior, la clave de la matriz anterior se reemplazará con su propio valor _value_ – Leigh

0
<?php 
$new = array(); 

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

} 
?> 
+0

Esto no produce la matriz de salida que el OP está solicitando. Por favor revise su código antes de publicarlo. – Leigh

+0

gracias, puse mi código rápidamente y no lo controlo. – 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

Esto cambiará el valor, no quiero cambiar el valor, deseo cambiar la clave. –

1

Acabo de resolver este mismo problema en mi propia aplicación, pero para mi aplicación $ keyReplaceInfoz actúa como el whitelist- si no se encuentra una clave, todo elemento que se retira de la matriz resultante, mientras que la coincidencia de la lista blanca las claves se traducen a los nuevos valores.

Supongo que podría aplicar este mismo algoritmo quizás con menos código total mediante el uso inteligente de array_map (http://php.net/manual/en/function.array-map.php), que tal vez otro lector generoso hará.

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

solución Shawn-k Adaptación @, aquí es un código más limpio utilizando array_walk, un viaje de solo reemplazar teclas deseadas, por supuesto, usted puede modificar según su conveniencia

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

Esta la solución que he implementado para el mismo tema:

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

¿En qué se diferencia esto del método mostrado en la pregunta en sí? –

+0

Debido a que este método no necesita tener una clave de reemplazo para cada clave en la matriz fuente. El método que se muestra en la pregunta dará un error si no existe ninguna clave de la matriz de origen en la matriz de claves de reemplazo –

+0

Tiene razón Juan, pero estaba seguro de que tendré todas las llaves disponibles para reemplazar. la pregunta era mejorar el método. ¡tu método todavía hace el mismo bucle! –

Cuestiones relacionadas