Rinominare le Chiavi di un Array Associativo Multidimensionale Preservando l'Ordine degli Elementi [PHP]

Rinominare le Chiavi di un Array Associativo Multidimensionale Preservando l'Ordine degli Elementi [PHP]

Rinominare una chiave di un array associativo in PHP non è una questione di magia, di solito possiamo farlo assegnando ad una nuova chiave il valore associato alla vecchia chiave, e facendo un unset del vecchio elemento. Ma le cose si complicano un po' quando vogliamo rinominare una chiave senza che gli elementi dell'array vengano rimescolati. In casi come questo, le funzioni PHP native non bastano. La creatività deve necessariamente entrare in gioco.

La soluzione che voglio condividere con te è una funzione procedurale che note le nuove chiavi, e le chiavi da rinominare, ricorre alla ricorsione per scorrere un dato array associativo multidimensionale e restituire un array nuovo di zecca avente tutti gli elementi nelle posizioni originali e gli elementi target caratterizzati dalle nuove chiavi.

La funzione è la seguente:

1/**
2 * Renames one key, or a hierarchy of keys, 
3 * of a multidimensional associative array.
4 *
5 * @param array $array
6 * @param array $old_keys Hierarchy of keys to rename.
7 * @param array $new_keys Hierarchy of replacement keys. 
8 *                        It must have the same 
9 *                        number of elements of $old_keys.
10 * @return array
11 */
12function &rename_array_keys( &$array, $old_keys, $new_keys ) {
13  $new_array = array();
14
15  // With each recursive call we extract one key 
16  // from each of the two arrays of keys.
17  $old_key = array_shift( $old_keys );
18  $new_key = array_shift( $new_keys );
19
20  foreach ( $array as $key => &$value ) {
21    // When this check succeeds it does mean that 
22    // we have found the key to rename.
23    if ( $key === $old_key ) {
24      if (
25        // When $old_keys and $new_keys still contain 
26        // elements it does mean that we are renaming 
27        // a hierarchy of keys, not just a single key.
28        $old_keys && $new_keys && 
29
30        // Ensures that the recursive call is triggered 
31        // only if $value is an array and actually 
32        // contains the next key to rename ( $old_keys[0] ).
33        isset( $value[$old_keys[0]] )
34      ) {
35        $new_array[$new_key] = rename_array_keys( $value, $old_keys, $new_keys ); 
36      }
37      else {
38        $new_array[$new_key] = $value;
39      }
40    }
41    else {
42      $new_array[$key] = $value;
43    }
44  }
45
46  return $new_array;
47}

Nel caso in cui dovessi rinominare la funzione quando la includerai nel tuo codice, non dimenticare di editare la chiamata ricorsiva!

Esemplificazione

Supponi di avere il seguente array associativo multidimensionale...

1$dictionary = array(
2  'a' => 1,
3  'b' => array(
4    'x' => 22,
5    'y' => 23,
6    'z' => 24
7  ),
8  'c' => 3
9);

...e che tu voglia rinominare le chiavi dell'elemento $dictionary['b']['z']. La funzione andrebbe chiamata in questo modo:

1$dictionary = rename_array_keys( $dictionary, array( 'b', 'z' ), array( 'green', 'blue' ) );

L'array risultante sarà questo:

1array(3) {
2  ["a"] => int(1)
3  ["green"] => array(3) {
4    ["x"]    => int(22)
5    ["y"]    => int(23)
6    ["blue"] => int(24)
7  }
8  ["c"] => int(3)
9}
TOP