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}