Corsi on-line

JSON: gestire gli annidamenti dei dati con PHP

In questo post voglio proporre un caso pratico che mi è capitato di dover gestire durante una recente richiesta di assistenza; quest’ultima verteva sull’esigenza di estrarre degli elementi specifici da un file contenente dati riportati in notazione JSON (JavaScript Object Notation), formato per l’interscambio di informazioni tra applicazioni client-server sempre più utilizzato nella realizzazione di soluzioni per il Web e non solo. Nel caso specifico la problematica da risolvere era incentrata sulla gestione dei nodi.

jsonPer comprendere l’oggetto dell’argomento in discussione è necessario partire da un esempio riguardante la struttura JSON in analisi, si ipotizzi quindi di dover estrarre dei dati da un file, denominato per esempio doc.json, scritto utilizzando la seguente notazione:

[
{
"hsim":{"nome":"Homer","cognome":"Simpson"}
},
{
"rwin":{"nome":"Ralph","cognome":"Winchester"}
},
{
"wsmi":{"nome":"Waylon","cognome":"Smithers"}
}
]

Come è semplice notare, ci troviamo davanti ad una struttura multidimensionale disposta su più livelli, a tal proposito basterebbe fare ricorso alla funzione var_dump() di PHP per averne una controprova stampata a video; infatti un semplice script come il seguente:

$file_json = "doc.json";
$json = json_decode(file_get_contents($file_json), true);
var_dump($json);

dovrebbe restituire un output formattato per livelli di profondità degli annidamenti come quello esposto di seguito:

array
  0 => 
    array
      'hsim' => 
        array
          'nome' => string 'Homer' (length=5)
          'cognome' => string 'Simpson' (length=7)
  1 => 
    array
      'rwin' => 
        array
          'nome' => string 'Ralph' (length=0)
          'cognome' => string 'Winchester' (length=10)
  2 => 
    array
      'wsmi' => 
        array
          'nome' => string 'Waylon' (length=6)
          'cognome' => string 'Smithers' (length=8)

In sostanza il quesito proposto è il seguente: si supponga di voler estrarre soltanto i dati associati ad un array di secondo livello, per esempio rwin, come fare per intercettarne l’informazione associata? A livello di indici infatti non abbiamo riferimenti diretti a quest’ultimo. La soluzione proposta è stata quuindi la seguente, cioè un ciclo d’interazione definito dentro un altro ciclo:

$keys = array_keys($json);
for($i = 0; $i < count($json); $i++) {
     foreach($json[$keys[$i]] as $key => $value) {
        if($key == "rwin"){
            echo $key."<br />";
        }
    }
}

In pratica il primo cilo, for, itera gli elementi presenti nel primo livello dell’array multidimensionale sulla base del loro numero, per ciascuna iterazione viene quindi estratta la coppia chiave/valore corrispondente tramite il foreach, mentre la condizione introdotta dall’if produce un confronto con ogni chiave estratta fino alla sua soddisfazione.

Post correlati
I più letti del mese
Tematiche