2012-03-07 20 views
35

Cuando var_dump en una variable llamada $ etiquetas (una matriz multidimensional) me sale esto:¿Cómo cambiar el nombre de las teclas de matriz en PHP?

Array 
(
    [0] => Array 
     (
      [name] => tabbing 
      [url] => tabbing 
     ) 

    [1] => Array 
     (
      [name] => tabby ridiman 
      [url] => tabby-ridiman 
     ) 

    [2] => Array 
     (
      [name] => tables 
      [url] => tables 
     ) 

    [3] => Array 
     (
      [name] => tabloids 
      [url] => tabloids 
     ) 

    [4] => Array 
     (
      [name] => taco bell 
      [url] => taco-bell 
     ) 

    [5] => Array 
     (
      [name] => tacos 
      [url] => tacos 
     ) 
) 

me gustaría cambiar el nombre de todas las claves de matriz llamados "URL" para ser llamado "valor". ¿Cuál sería una buena manera de hacer esto?

+1

cómo se genera '$ tags'? –

+0

Vea esta publicación de SO: http://stackoverflow.com/questions/240660/in-php-how-do-you-change-the-key-of-an-array-element – Bjoern

+0

posible duplicado de [PHP renombrar claves de matriz en una matriz multidimensional] (http://stackoverflow.com/questions/2212948/php-rename-array-keys-in-multidimensional-array) – Caleb

Respuesta

96

Puede usar array_map() para hacerlo.

$tags = array_map(function($tag) { 
    return array(
     'name' => $tag['name'], 
     'value' => $tag['url'] 
    ); 
}, $tags); 
+8

¡agradable! nota rápida: los cierres (funciones anónimas) solo están disponibles en php 5.3.0+ – Mallard

+4

nota rápida: debe utilizar PHP 5.6 o superior, de lo contrario, está ejecutando una versión no compatible de php y posiblemente tenga problemas de seguridad. –

17

Pasa el cursor, configura la nueva clave, desactívala.

foreach($tags as &$val){ 
    $val['value'] = $val['url']; 
    unset($val['url']); 
} 
1
foreach ($basearr as &$row) 
{ 
$row['value'] = $row['url']; 
unset($row['url']); 
} 
7

se puede hacer algo como esto

foreach($tags as &$tag){ 
    $tag['value'] = $tag['url']; 
    unset($tag['url']); 
} 
2

Esto debería funcionar en la mayoría de versiones de PHP 4+. El mapa de matriz que usa funciones anónimas no se admite debajo de 5.3.

También los ejemplos foreach lanzarán una advertencia cuando se usa un estricto manejo de errores PHP.

Aquí hay una pequeña función de cambio de nombre multidimensional. También se puede usar para procesar matrices para tener las claves correctas de integridad en toda la aplicación. No lanzará ningún error cuando una clave no exista.

function multi_rename_key(&$array, $old_keys, $new_keys) 
{ 
    if(!is_array($array)){ 
     ($array=="") ? $array=array() : false; 
     return $array; 
    } 
    foreach($array as &$arr){ 
     if (is_array($old_keys)) 
     { 
      foreach($new_keys as $k => $new_key) 
      { 
       (isset($old_keys[$k])) ? true : $old_keys[$k]=NULL; 
       $arr[$new_key] = (isset($arr[$old_keys[$k]]) ? $arr[$old_keys[$k]] : null); 
       unset($arr[$old_keys[$k]]); 
      } 
     }else{ 
      $arr[$new_keys] = (isset($arr[$old_keys]) ? $arr[$old_keys] : null); 
      unset($arr[$old_keys]); 
     } 
    } 
    return $array; 
} 

El uso es simple. Puede cambiar una sola clave, como en su ejemplo:

multi_rename_key($tags, "url", "value"); 

o una multicircuito más complejo

multi_rename_key($tags, array("url","name"), array("value","title")); 

Se utiliza una sintaxis similar a preg_replace(), donde la cantidad de $ old_keys y new_keys $ deben estar lo mismo. Sin embargo, cuando no están en blanco, se agrega una clave. Esto significa que puede usarlo para agregar un esquema de tipo si a su matriz.

Use esto todo el tiempo, ¡espero que ayude!

+0

O simplemente puede usar array_map ($ etiquetas, create_function ('$ tag', 'return array ("nombre" => $ etiqueta ["nombre"], "valor" => $ etiqueta ["url"]')); – Noishe

+0

Eso se complica cuando se cambia el nombre de forma sistemática. También create_function usa eval, que obviamente debe evitarse si es posible. –

+0

¿por qué tan innecesariamente complicado? – ahnbizcad

3

Hablando de PHP funcional, tengo esta respuesta sea más genérico:

array_map(function($arr){ 
     $ret = $arr; 
     $ret['value'] = $ret['url']; 
     unset($ret['url']); 
     return $ret; 
    }, $tag); 
} 
1

php recursiva cambiar el nombre de función de teclas:

function replaceKeys($oldKey, $newKey, array $input){ 
    $return = array(); 
    foreach ($input as $key => $value) { 
     if ($key===$oldKey) 
      $key = $newKey; 

     if (is_array($value)) 
      $value = replaceKeys($oldKey, $newKey, $value); 

     $return[$key] = $value; 
    } 
    return $return; 
} 
0
class DataHelper{ 

    private static function __renameArrayKeysRecursive($map = [], &$array = [], $level = 0, &$storage = []) { 
     foreach ($map as $old => $new) { 
      $old = preg_replace('/([\.]{1}+)$/', '', trim($old)); 
      if ($new) { 
       if (!is_array($new)) { 
        $array[$new] = $array[$old]; 
        $storage[$level][$old] = $new; 
        unset($array[$old]); 
       } else { 
        if (isset($array[$old])) { 
         static::__renameArrayKeysRecursive($new, $array[$old], $level + 1, $storage); 
        } else if (isset($array[$storage[$level][$old]])) { 
         static::__renameArrayKeysRecursive($new, $array[$storage[$level][$old]], $level + 1, $storage); 
        } 
       } 
      } 
     } 
    } 

    /** 
    * Renames array keys. (add "." at the end of key in mapping array if you want rename multidimentional array key). 
    * @param type $map 
    * @param type $array 
    */ 
    public static function renameArrayKeys($map = [], &$array = []) 
    { 
     $storage = []; 
     static::__renameArrayKeysRecursive($map, $array, 0, $storage); 
     unset($storage); 
    } 
} 

Uso:

DataHelper::renameArrayKeys([ 
    'a' => 'b', 
    'abc.' => [ 
     'abcd' => 'dcba' 
    ] 
], $yourArray); 
0

Es de la pregunta duplicada

$json = '[ 
{"product_id":"63","product_batch":"BAtch1","product_quantity":"50","product_price":"200","discount":"0","net_price":"20000"},  
{"product_id":"67","product_batch":"Batch2","product_quantity":"50","product_price":"200","discount":"0","net_price":"20000"} 
]'; 

$array = json_decode($json, true); 

$out = array_map(function ($product) { 
    return array_merge([ 
    'price' => $product['product_price'], 
    'quantity' => $product['product_quantity'], 
    ], array_flip(array_filter(array_flip($product), function ($value) { 
    return $value != 'product_price' && $value != 'product_quantity'; 
    }))); 
}, $array); 

var_dump($out); 

https://repl.it/@Piterden/Replace-keys-in-array

Cuestiones relacionadas