<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>strutture-complesse &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://en.wordpress.com/tag/strutture-complesse/</link>
	<description>Feed of posts on WordPress.com tagged "strutture-complesse"</description>
	<pubDate>Sat, 28 Nov 2009 20:59:28 +0000</pubDate>

	<generator>http://en.wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[PHP - Ispezione delle strutture complesse (array e oggetti)]]></title>
<link>http://gianfrasoft.wordpress.com/2008/02/09/php-ispezione-delle-strutture-complesse-array-e-oggetti/</link>
<pubDate>Sat, 09 Feb 2008 16:56:29 +0000</pubDate>
<dc:creator>gianfrasoft</dc:creator>
<guid>http://gianfrasoft.wordpress.com/2008/02/09/php-ispezione-delle-strutture-complesse-array-e-oggetti/</guid>
<description><![CDATA[Consideriamo di dover accedere ad un array associativo di cui non si conosce la reale struttura. L]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Consideriamo di dover accedere ad un array associativo di cui non si conosce la reale struttura. L&#8217;array può contenere, in ciascuna locazione, informazioni di qualsiasi tipo: esso può contenere contemporaneamente stringhe, interi o anche altri array associativi.</p>
<p>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 &#8220;foreach<em>&#8221; </em>come descritto di seguito:</p>
<p align="center"><strong>foreach($array as $name =&#62; $value)</strong></p>
<p>dove la variabile $array contiene l&#8217;array che vogliamo esaminare e le variabili $name e $value conterranno, ad ogni ciclo, il nome ed il valore di ciascun elemento dell&#8217;array.</p>
<p>Ad ogni ciclo, per stabilire se l&#8217;elemento dell&#8217;array associativo che stiamo esaminando è a sua volta un array, basta far riferimento alla funzione <em>is_array</em> del PHP: in caso positivo si può richiamare la stessa funzione ricorsivamente perché esamini il contenuto del nuovo array.</p>
<p>Generiamo, quindi, una struttura XML che in corrispondenza di ogni array produce un nodo XML che indicheremo con &#60;bag&#62; ed in corrispondenza di ciascun elemento semplice produca un nodo XML &#60;item&#62; contenente tra gli attributi il nome ed il tipo dello stesso:</p>
<pre><!--more-->function inspect_array($array, $indent, $string)
{
  foreach($array as $name =&#62; $value)
  {
    if (is_array($value))
    {
      $string = $string.$indent."&#60;"."bag"."name=\"$name\""." phpType=\"array\"&#62;\n";</pre>
<pre>      // ricorsione
      $string = inspect_array($value, $indent.' ', $string);
      $string = $string.$indent."&#60;/"."bag"."&#62;\n";
    }
    else
    {
      $string = $string.$indent."&#60;"."item"."name=\"$name\""." phpType=\"".
      gettype($value)."\"&#62;".htmlspecialchars($value)."&#60;/"."item"."&#62;\n";
    }
  }
  return $string;
}</pre>
<pre>$params = array_map_deep($_REQUEST["params"]);
$xmlstring = "&#60;?xml version=\"1.0\"?&#62;\n";
$xmlstring = $xmlstring."&#60;resultString&#62;\n";
$xmlstring = $xmlstring." &#60;"."bag name=\"result\"phpType=\"object\"&#62;\n";
$xmlstring = inspect_obj_array($params, ' ', $xmlstring);
$xmlstring = $xmlstring." &#60;/"."bag"."&#62;\n";
$xmlstring = $xmlstring."&#60;/resultString&#62;\n";</pre>
<p><!--more-->Sotto è riportato come esempio il risultato del processamento di un array contenente alcuni dati anagrafici: l&#8217;indirizzo è a sua volta un array contenente tre elementi semplici.</p>
<pre><!--more-->&#60;?xml version="1.0" ?&#62;
  &#60;resultString&#62;
    &#60;bag name="result" phpType="object"&#62;
      &#60;item name="nominativo" phpType="string"&#62;Gianfranco Fedele &#60;/item&#62;
      &#60;item name="eta" phpType="integer"&#62;31&#60;/item&#62;
      &#60;bag name="indirizzo" phpType="array"&#62;
        &#60;item name="via" phpType="string"&#62;via del Maratoneta&#60;/item&#62;
        &#60;item name="civico" phpType="integer"&#62;8&#60;/item&#62;
        &#60;item name="citta" phpType="string"&#62;Napoli&#60;/item&#62;
      &#60;/bag&#62;
    &#60;/bag&#62;
  &#60;/resultString&#62;</pre>
<p><!--more-->Nel caso in cui s&#8217;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.<br />
Pertanto, volendo estendere la funzione al caso dell&#8217;ispezione, oltre che degli array associativi, anche degli oggetti, dovremo scrivere:</p>
<pre><!--more-->function inspect_obj_array($array, $indent, $string)
{
  foreach($array as $name =&#62; $value)</pre>
<pre>  {
    if (is_array($value))
    {
      $string = $string.$indent."&#60;"."bag"." name=\"$name\""." phpType=\"array\"&#62;\n";
      // ricorsione
      $string = inspect_obj_array($value, $indent.' ', $string);
      $string = $string.$indent."&#60;/"."bag"."&#62;\n";
    }</pre>
<pre>    if (is_object($value))
    {
      $string = $string.$indent."&#60;"."bag"." name=\"$name\""." phpType=\"object\"&#62;\n";</pre>
<pre>      // ricorsione
      $vars = get_object_vars($value);
      $string = inspect_obj_array($vars, $indent.' ', $string);</pre>
<pre>      $string = $string.$indent."&#60;/"."bag"."&#62;\n";</pre>
<pre>    }
    if (!(is_array($value)) &#38;&#38; (!is_object($value)))
    {
      $string = $string.$indent."&#60;"."item"." name=\"$name\""." phpType=\"".
      gettype($value)."\"&#62;".htmlspecialchars($value)."&#60;/"."item"."&#62;\n";
    }
  }
  return $string;
}</pre>
<pre>$params = array_map_deep($_REQUEST["params"]);$xmlstring = "&#60;?xml version=\"1.0\"?&#62;\n";
$xmlstring = $xmlstring."&#60;resultString&#62;\n";
$xmlstring = $xmlstring." &#60;"."bag name=\"result\" phpType=\"object\"&#62;\n";
$xmlstring = inspect_obj_array($params, ' ', $xmlstring);
$xmlstring = $xmlstring." &#60;/"."bag"."&#62;\n";
$xmlstring = $xmlstring."&#60;/resultString&#62;\n";</pre>
<p><!--more--></p>
</div>]]></content:encoded>
</item>

</channel>
</rss>
