2010-02-06 17 views
26

En una matriz como la siguiente, ¿cómo podría cambiar el nombre de "fee_id" a "id"?PHP cambiar el nombre de las teclas de matriz en matriz multidimensional

Array 
(
    [0] => Array 
     (
      [fee_id] => 15 
      [fee_amount] => 308.5 
      [year] => 2009     
     ) 

    [1] => Array 
     (
      [fee_id] => 14 
      [fee_amount] => 308.5 
      [year] => 2009 

     ) 

) 
+9

¿Estos datos provienen de una base de datos? ¿Podrías cambiar la consulta? 'SELECCIONAR fee_id como id, fee_amount como amount, year FROM .....'? – gnarf

+0

sí, pero esta matriz y la consulta que la genera se utiliza en toda la aplicación y es más fácil simplemente cambiar la salida en un solo lugar. – stef

+0

posible duplicado de [En PHP, ¿cómo se cambia la clave de un elemento de matriz?] (Http://stackoverflow.com/questions/240660/in-php-how-do-you-change-the-key-of -an-array-element) – Oleg

Respuesta

37
foreach ($array as $k=>$v) 
{ 
    $array[$k] ['id'] = $array[$k] ['fee_id']; 
    unset($array[$k]['fee_id']); 
} 

Esto debería funcionar

+2

Probablemente quiera hacerlo 'foreach (array_keys ($ array) as $ k)' o 'foreach ($ array as $ k => $ v)' – gnarf

+0

Gracias, olvidé el => $ v – lamas

+4

Esto cambiará la orden: la nueva clave estará al final – Oleg

0

Copie el valor 'fee_id' actual a una nueva clave llamada 'id' y desactive la clave anterior?

foreach ($array as $arr) 
{ 
    $arr['id'] = $arr['fee_id']; 
    unset($arr['fee_id']); 
} 

No hay ninguna función integrada haciendo tan poco afaik.

+4

Tienes que hacer $ arr una referencia, 'foreach (... as & $ arr)'. De lo contrario, los cambios en $ arr no cambiarán $ array. – VolkerK

+3

Esto no funciona, el manual de PHP dice: a menos que se haga referencia a la matriz, foreach opera en una copia de la matriz especificada y no la matriz en sí –

+0

Ah, gracias por la actualización. No me di cuenta :-). – TheGrandWazoo

1
$arrayNum = count($theArray); 

for($i = 0 ; $i < $arrayNum ; $i++) 
{ 
    $fee_id_value = $theArray[$i]['fee_id']; 
    unset($theArray[$i]['fee_id']); 
    $theArray[$i]['id'] = $fee_id_value; 
} 

Esto debería funcionar.

+2

$ i lamas

+0

¿Porque lo vuelve a contar cada vez? –

+0

Sí, suponiendo que tiene una gran matriz, esto contará siempre y la página se cargará más lentamente/la carga del servidor aumentará – lamas

-3

He estado tratando de resolver este problema durante un par de horas utilizando funciones recursivas, pero finalmente me di cuenta de que no necesitamos recurrencia en absoluto. A continuación está mi enfoque.

$search = array('key1','key2','key3'); 
$replace = array('newkey1','newkey2','newkey3'); 

$resArray = str_replace($search,$replace,json_encode($array)); 
$res = json_decode($resArray); 

De esta manera podemos evitar el bucle y la recursividad.

Espero que ayude.

+0

Esta es una forma realmente ordenada de hacerlo. Es bueno el rendimiento? Me imagino que es rápido para trabajar con cadenas en PHP. – djskinner

+0

Si está ejecutando matrices asociativas, asegúrese de usar el segundo parametro de json_decode con la solución de Antonio: '$ res = json_decode ($ resArray, true);' Gracias, Antonio. Me acabo de unir SO solo para votar y "¡Sí!" esta. –

+0

La ventaja de esto sobre la respuesta de lamas es que mantiene la matriz en el mismo orden. – Waggers

14

Puede usar array_map() para hacerlo.

$myarray = array_map(function($tag) { 
    return array(
     'id' => $tag['fee_id'], 
     'fee_amount' => $tag['fee_amount'], 
     'year' => $tag['year'] 
    ); }, $myarray); 
0

Esta es la solución de trabajo, i probado.

foreach ($myArray as &$arr) { 
    $arr['id'] = $arr['fee_id']; 
    unset($arr['fee_id']); 
} 
+0

Tenga en cuenta que el uso de variables de referencia en un ciclo for como este podría ser una idea terrible. Ver http://stackoverflow.com/questions/3307409/php-pass-by-reference-in-foreach – Pang

0

El fragmento que sigue renombrará una clave matriz asociativa, mientras que la preservación del orden (a veces ... debemos). Puede sustituir el valor $ de la nueva clave si necesita reemplazar por completo un artículo.

$old_key = "key_to_replace"; 
$new_key = "my_new_key"; 

$intermediate_array = array(); 
while (list($key, $value) = each($original_array)) { 
    if ($key == $old_key) { 
    $intermediate_array[$new_key] = $value; 
    } 
    else { 
    $intermediate_array[$key] = $value; 
    } 
} 
$original_array = $intermediate_array; 
0

Modificada de 0-> feild0, 1-> field1,2-> campo2 ....

Este es sólo un ejemplo en el que me sale valores separados por comas en la cadena y convertirla en matriz multidimensional y luego usando bucle foreach i cambiado valor de clave de la matriz

<?php 

    $str = "abc,def,ghi,jkl,mno,pqr,stu 
    abc,def,ghi,jkl,mno,pqr,stu 
    abc,def,ghi,jkl,mno,pqr,stu 
    abc,def,ghi,jkl,mno,pqr,stu; 

    echo '<pre>'; 
    $arr1 = explode("\n", $str); // this will create multidimensional array from upper string 
    //print_r($arr1); 
    foreach ($arr1 as $key => $value) { 
     $arr2[] = explode(",", $value); 
     foreach ($arr2 as $key1 => $value1) { 
      $i =0; 
      foreach ($value1 as $key2 => $value2) { 
       $key3 = 'field'.$i; 
       $i++; 
       $value1[$key3] = $value2; 
       unset($value1[$key2]);   
      } 
     } 
     $arr3[] = $value1; 
    } 
    print_r($arr3); 


    ?> 
0

I escribió una función para hacer que el uso de objetos o matrices (simples o multidimensionales) ver en https://github.com/joaorito/php_RenameKeys.

Bellow es un ejemplo simple, puede usar una función json combinar con reemplazar para hacerlo.

// Your original array (single or multi) 

$original = array(
'DataHora' => date('YmdHis'), 
'Produto' => 'Produto 1', 
'Preco'  => 10.00, 
'Quant'  => 2); 

// Your map of key to change 

$map = array(
'DataHora' => 'Date', 
'Produto' => 'Product', 
'Preco'  => 'Price', 
'Quant'  => 'Amount'); 

$temp_array = json_encode($original); 

foreach ($map AS $k=>$v) { 
    $temp_array = str_ireplace('"'.$k.'":','"'.$v.'":', $temp); 
    } 

$new_array = json_decode($temp, $array); 
Cuestiones relacionadas