8. Array multidimensionali e associativi

Array multidimensionali

Come abbiamo visto nel capitolo precedente, un normale array contiene all'interno dei suoi elementi, valori semplici come numeri interi, stringhe e così via.

Un array può però contenere a sua volta un altro array, dando vita ad un array multidimensionale.

Abbiamo vari modi per inizializzare un array multidimensionale, vediamo di seguito quattro blocchi di codice equivalenti, che svolgono cioè la medesima operazione :

dati.push(new Array("mario", "rossi", "roma"));
dati.push(new Array("luca", "verdi", "milano"));

dati.push(["mario", "rossi", "roma"]);
dati.push(["luca", "verdi", "milano"]);

dati[0] = new Array("mario", "rossi", "roma");
dati[1] = new Array("luca", "verdi", "milano");

dati[0] = ["mario", "rossi", "roma"];
dati[1] = ["luca", "verdi", "milano"];

Vediamo ora un esempio completo utilizzando la vecchia Classe documento HelloWorld :

package
{
	import flash.display.MovieClip;

	public class HelloWorld extends MovieClip
	{
		public function HelloWorld():void
		{
			var dati:Array = new Array();

			dati[0] = new Array("mario", "rossi", "roma");
			dati[1] = new Array("luca", "verdi", "milano");

			trace(dati[0][2]); // Output : roma
			trace(dati[1][1]); // Output : verdi
		}
	}
}

Concettualmente esiste un altro modo per memorizzare dati multidimensionali negli array, ossia inserendo istanze di oggetti, comunemente istanze della classe Object, ma ricordate che potete sempre memorizzarvi qualunque istanza di una qualunque classe.

Essendo Object la classe base in ActionScript 3, essa sarà utilizzata di default ogni volta che non sarà specificato altrimenti.

Il codice che segue inizializza un Array "dati" e inserisce nel primo elemento un'istanza di Object con tre attributi :
nome, cognome e residenza.

Per il secondo elemento viene mostrato un altro metodo per eseguire la medesima operazione.

var dati:Array = new Array();

dati[0] = {nome: "Mario", cognome: "Rossi", residenza: "Roma"};
dati.push({nome: "Luca", cognome: "Verdi", residenza: "Milano"});

trace(typeof(dati[0])); // Output : object
trace(dati[1].residenza); // Output : Milano

Nel caso in cui non vogliate che venga usata un'istanza di Object, ma bensì di una vostra classe, allora procedete come segue :

var dati:Array = new Array();

dati[0] = new MiaClasse();

dati[0].attributo1 = "valore";
dati[0].attributo2 = "valore";

Array associativi

Fino ad ora abbiamo visto degli array la cui posizione degli elementi veniva identificata tramite un'indice numerico di tipo int.

In ActionScript 3 è possibile creare un altro tipo di array, anche essi volendo multidimensionali, la cui posizione degli elementi viene indicata però con una stringa (chiave), dando vita ad un Array associativo.

Parlando di array associativi, è abitudine nella programmazione dare un altro nome agli indici che indicano la posizione degli elementi, chiamandoli chiavi.

Ma vediamo un frammento di codice più semplice dove mostrerò la corretta sintassi per inizializzare un array associativo :

var dati:Array = new Array();

dati["nome"] = "Mario";
dati["cognome"] = "Rossi";
dati["residenza"] = "Roma";

for (var chiave:String in dati)
	trace(chiave + " = " + dati[chiave]);

/* Output

nome = Mario
cognome = Rossi
residenza = Roma */

Il costrutto for in verrà spiegato in dettaglio nei capitoli seguenti, per il momento ci basti sapere che ci consente di scorrere un array considerando ogni elemento che esso contiene.

Per utilizzare un array associativo in maniera multidimensionale, la sintassi è la stessa vista in precedenza :

var dati:Array = new Array();

dati["impiegato"] = ["Mario", "Rossi"];
dati["stipendio"] = [1200, "euro"]

for (var chiave:String in dati)
	trace(chiave + " = " + dati[chiave][0] + " " + dati[chiave][1]);

/* Output

impiegato = Mario Rossi
stipendio = 1200 euro */