PHP – Ispezione delle strutture complesse (array e oggetti) 9 Febbraio 2008
Posted by gianfrasoft in PHP.Tags: array, ispezione, PHP, PHP array ispezione di strutture complesse XML, strutture complesse, XML
trackback
Consideriamo di dover accedere ad un array associativo di cui non si conosce la reale struttura. L’array può contenere, in ciascuna locazione, informazioni di qualsiasi tipo: esso può contenere contemporaneamente stringhe, interi o anche altri array associativi.
In PHP è facile accedere al contenuto di un array associativo anche se non se ne conosce la struttura interna. Per far ciò basta effettuare un semplice ciclo “foreach” come descritto di seguito:
foreach($array as $name => $value)
dove la variabile $array contiene l’array che vogliamo esaminare e le variabili $name e $value conterranno, ad ogni ciclo, il nome ed il valore di ciascun elemento dell’array.
Ad ogni ciclo, per stabilire se l’elemento dell’array associativo che stiamo esaminando è a sua volta un array, basta far riferimento alla funzione is_array del PHP: in caso positivo si può richiamare la stessa funzione ricorsivamente perché esamini il contenuto del nuovo array.
Generiamo, quindi, una struttura XML che in corrispondenza di ogni array produce un nodo XML che indicheremo con <bag> ed in corrispondenza di ciascun elemento semplice produca un nodo XML <item> contenente tra gli attributi il nome ed il tipo dello stesso:
function inspect_array($array, $indent, $string)
{
foreach($array as $name => $value)
{
if (is_array($value))
{
$string = $string.$indent."<"."bag"."name=\"$name\""." phpType=\"array\">\n";
// ricorsione
$string = inspect_array($value, $indent.' ', $string);
$string = $string.$indent."</"."bag".">\n";
}
else
{
$string = $string.$indent."<"."item"."name=\"$name\""." phpType=\"".
gettype($value)."\">".htmlspecialchars($value)."</"."item".">\n";
}
}
return $string;
}
$params = array_map_deep($_REQUEST["params"]); $xmlstring = "<?xml version=\"1.0\"?>\n"; $xmlstring = $xmlstring."<resultString>\n"; $xmlstring = $xmlstring." <"."bag name=\"result\"phpType=\"object\">\n"; $xmlstring = inspect_obj_array($params, ' ', $xmlstring); $xmlstring = $xmlstring." </"."bag".">\n"; $xmlstring = $xmlstring."</resultString>\n";
Sotto è riportato come esempio il risultato del processamento di un array contenente alcuni dati anagrafici: l’indirizzo è a sua volta un array contenente tre elementi semplici.
<?xml version="1.0" ?>
<resultString>
<bag name="result" phpType="object">
<item name="nominativo" phpType="string">Gianfranco Fedele </item>
<item name="eta" phpType="integer">31</item>
<bag name="indirizzo" phpType="array">
<item name="via" phpType="string">via del Maratoneta</item>
<item name="civico" phpType="integer">8</item>
<item name="citta" phpType="string">Napoli</item>
</bag>
</bag>
</resultString>
Nel caso in cui s’intenda esaminare oggetti (array contenenti oggetti o oggetti contenenti array), il PHP mette a disposizione una importante funzione che consente di esaminare il contenuto di un oggetto come fosse un array associativo. La funzione di chiama get_object_vars.
Pertanto, volendo estendere la funzione al caso dell’ispezione, oltre che degli array associativi, anche degli oggetti, dovremo scrivere:
function inspect_obj_array($array, $indent, $string)
{
foreach($array as $name => $value)
{
if (is_array($value))
{
$string = $string.$indent."<"."bag"." name=\"$name\""." phpType=\"array\">\n";
// ricorsione
$string = inspect_obj_array($value, $indent.' ', $string);
$string = $string.$indent."</"."bag".">\n";
}
if (is_object($value))
{
$string = $string.$indent."<"."bag"." name=\"$name\""." phpType=\"object\">\n";
// ricorsione
$vars = get_object_vars($value);
$string = inspect_obj_array($vars, $indent.' ', $string);
$string = $string.$indent."</"."bag".">\n";
}
if (!(is_array($value)) && (!is_object($value)))
{
$string = $string.$indent."<"."item"." name=\"$name\""." phpType=\"".
gettype($value)."\">".htmlspecialchars($value)."</"."item".">\n";
}
}
return $string;
}
$params = array_map_deep($_REQUEST["params"]);$xmlstring = "<?xml version=\"1.0\"?>\n"; $xmlstring = $xmlstring."<resultString>\n"; $xmlstring = $xmlstring." <"."bag name=\"result\" phpType=\"object\">\n"; $xmlstring = inspect_obj_array($params, ' ', $xmlstring); $xmlstring = $xmlstring." </"."bag".">\n"; $xmlstring = $xmlstring."</resultString>\n";
Commenti»
No comments yet — be the first.