2010-02-06 17 views
26

In un array come quello riportato di seguito, come è possibile rinominare "fee_id" in "id"?PHP rinominare le chiavi dell'array nell'array multidimensionale

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

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

     ) 

) 
+9

Questi dati provengono da un database? Potresti cambiare la domanda? 'SELECT fee_id come id, fee_amount come importo, anno FROM .....'? – gnarf

+0

sì, ma questa matrice e la query che gens è utilizzata in tutta l'app ed è più semplice cambiare l'output in un unico punto. – stef

+0

possibile duplicato di [In PHP, come si modifica la chiave di un elemento dell'array?] (Http://stackoverflow.com/questions/240660/in-php-how-do-you-change-the-key-of -an-array-element) – Oleg

risposta

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

Questo dovrebbe funzionare

+2

Probabilmente vuoi renderlo 'foreach (array_keys ($ array) come $ k)' o 'foreach ($ array come $ k => $ v)' – gnarf

+0

Grazie, ho dimenticato il => $ v – lamas

+4

Questo cambierà il ordine: la nuova chiave sarà alla fine – Oleg

0

Copia il valore 'fee_id' corrente in una nuova chiave denominata 'id' e disinserire la chiave precedente?

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

non esiste una funzione builtin fare tali afaik sottile.

+4

Devi fare un riferimento a $ arr, 'foreach (... as & $ arr)'. Altrimenti le modifiche in $ arr non cambieranno $ array. – VolkerK

+3

Questo non funziona, il manuale PHP dice: A meno che l'array sia referenziato, foreach opera su una copia dell'array specificato e non sull'array stesso –

+0

Ah, grazie per l'aggiornamento. Non ce ne siamo accorti :-). – 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; 
} 

Questo dovrebbe funzionare.

+2

$ i lamas

+0

Perché lo conta nuovamente ogni volta? –

+0

Sì, supponendo che abbia un grande array questo lo conteggia ogni volta e la pagina si caricherà più lentamente/il carico del server aumenterà – lamas

-3

Ho cercato di risolvere questo problema per un paio d'ore utilizzando le funzioni ricorsive, ma alla fine mi sono reso conto che non abbiamo affatto bisogno di ricorsione. Di seguito è il mio approccio.

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

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

In questo modo è possibile evitare il loop e la ricorsione.

Hope It helps.

+0

Questo è un modo davvero bello di farlo. Le prestazioni sono buone? Immagino che sia veloce a lavorare con le stringhe in PHP. – djskinner

+0

Se stai cullando array associativi, assicurati di utilizzare il secondo param di json_decode con la soluzione di Antonio: '$ res = json_decode ($ resArray, true);' Grazie, Antonio. Mi sono appena unito a SO solo per upvotare e "Sì!" Questo. –

+0

Il vantaggio di questo rispetto alla risposta dei lama è che mantiene la matrice nello stesso ordine. – Waggers

14

È possibile utilizzare array_map() per farlo.

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

Questa è la soluzione di lavoro, l'ho testata.

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

Si noti che l'utilizzo di variabili di riferimento in un ciclo for come questo potrebbe essere una pessima idea. Vedi http://stackoverflow.com/questions/3307409/php-pass-by-reference-in-foreach – Pang

0

Il frammento di seguito rinomina una chiave array associativo preservando cassa (talvolta ... dobbiamo). È possibile sostituire il valore $ della nuova chiave se è necessario sostituire completamente un elemento.

$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

fabbricato 0-> feild0, 1-> field1,2-> field2 ....

Questo è solo un esempio in cui ottengo valori separati da virgola nella stringa e convertirlo in array multidimensionale e quindi utilizzando ciclo foreach i cambiato valore di chiave di matrice

<?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

ho scritto una funzione per farlo utilizzando oggetti o array (singole o multidimensionali) vedi a https://github.com/joaorito/php_RenameKeys.

Bellow è un semplice esempio, è possibile utilizzare una funzione JSON combinare con Sostituisci per farlo.

// 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); 
Problemi correlati