Cambiar el nombre de la clave en cada fila de una matriz 2d

3 minutos de lectura

avatar de usuario de stef
Stef

En una matriz como la siguiente, ¿cómo podría cambiar el nombre de “fee_id” a “id”?

Matriz de entrada:

[
    ['fee_id' => 15, 'fee_amount' => 308.5, 'year' => 2009],
    ['fee_id' => 14, 'fee_amount' => 308.5, 'year' => 2009],
]

Resultado Esperado:

[
    ['id' => 15, 'fee_amount' => 308.5, 'year' => 2009],
    ['id' => 14, 'fee_amount' => 308.5, 'year' => 2009],
]

  • ¿Estos datos provienen de una base de datos? ¿Podrías cambiar la consulta? SELECT fee_id as id, fee_amount as amount, year FROM .....?

    – gnarf

    6 de febrero de 2010 a las 11:56

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

    – Stef

    6 de febrero de 2010 a las 13:28

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

Esto debería funcionar

  • Probablemente quieras hacerlo foreach( array_keys($array) as $k) o foreach($array as $k=>$v)

    – gnarf

    6 de febrero de 2010 a las 11:53

  • Esto cambiará el orden: la nueva clave estará al final

    – Oleg

    29 de octubre de 2014 a las 9:53

  • ¿Por qué no usar $v['fee_id'] en lugar de $array[$k] ['fee_id'] ?

    – Y Feizi

    15 de febrero de 2015 a las 8:21


  • Yfeizi, porque eso solo cambiará la variable temporal $v, y queremos cambiar la matriz original.

    – pbarney

    19 de junio de 2020 a las 21:28

Podrías 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);

Avatar de usuario de Niels Bom
niels bom

$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.

  • ¿Porque lo vuelve a contar cada vez?

    – Niels Bom

    6 de febrero de 2010 a las 11:56

  • Sí, suponiendo que tenga una gran matriz, esto lo contará cada vez y la página se cargará más lentamente / la carga del servidor aumentará

    – llamas

    6 de febrero de 2010 a las 11:59

¿Copiar el valor actual de ‘fee_id’ en una nueva clave llamada ‘id’ y anular la configuración de la clave anterior?

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

No hay una función incorporada que haga un afaik tan delgado.

Esta es la solución de trabajo, la probé.

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

  • Tenga en cuenta que usar variables de referencia en un bucle for como este podría ser una idea terrible. Ver stackoverflow.com/questions/3307409/…

    – Pang

    31 de agosto de 2016 a las 7:03

Avatar de usuario de GabeSullice
GabeSullice

El fragmento a continuación cambiará el nombre de una clave de matriz asociativa mientras conserva el orden (a veces… debemos hacerlo). Puede sustituir el valor de $ de la nueva clave si necesita reemplazar un elemento por completo.

$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;

  • Tenga en cuenta que usar variables de referencia en un bucle for como este podría ser una idea terrible. Ver stackoverflow.com/questions/3307409/…

    – Pang

    31 de agosto de 2016 a las 7:03

Convertido 0->campo0, 1->campo1,2->campo2….

Este es solo un ejemplo en el que obtengo un valor separado por comas en una cadena y lo convierto en una matriz multidimensional y luego, usando el ciclo foreach, cambié el valor 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);


   ?>

¿Ha sido útil esta solución?