Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Introduzione e gestione di array

Impariamo ad usare questo fondamentale tipo di dati
Impariamo ad usare questo fondamentale tipo di dati
Link copiato negli appunti

Gli array sono uno dei tipi di dati complessi più versatili e maggiormente utilizzati in qualsiasi linguaggio di programmazione. Rappresentano un formato particolarmente adatto per eseguire la maggior parte delle operazioni che richieda la memorizzazione temporanea e l'elaborazione di una lista di informazioni.

Forse per la loro struttura "particolare", non sempre gli array risultano altrettanto digeribili come i formati stringa, booleano e numerico. Ricordo che quanto mi avvicinai per la prima volta ad ASP ero ancora decisamente a digiuno di linguaggi di sviluppo. Per i primi tempi tentai in tutti i modi di scartare l'uso di array riempiendo i codici di inutili elenchi di variabili.

Ancora oggi mi capita, seppur raramente, di trovare qualche paginetta in ASP scritta nei primi tempi e, a distanza di qualche anno, mi sembra veramente inconcepibile immaginare il tempo speso a copia/incollare variabili.

Per evitare di spendere tempo e risorse inutilmente nello sviluppo di script poco usabili, in questo articolo vedremo una breve introduzione agli array esplorando le principali funzioni di ASP + VBScript che consentono l'interazione con questo formato di dati.

Prima di cominciare è necessaria una premessa. Come ho già avuto modo di anticipare in altri articoli, la concezione di "tipo di dati" in ASP non è così orientata alla programmazione come in altri linguaggi, web oriented e non. Nonostante ASP non disponga di diversi tipi di dati bensì di uno solo con sfumature differenti, per semplicità considereremo array, stringhe, numeri e booleani come totalmente differenti ed indipendenti.

Array, vettori e matrici

Senza addentrarci nelle definizioni matematiche è necessario chiarire in principio il significato di questi 3 termini molto spesso utilizzati come sinonimi.

Di norma, si usa raccogliere sotto il termine informatico array sia gli elementi matematici corrispondenti a vettori sia le matrici. In questo articolo utilizzeremo come convenzione il termine vettori come riferimento ad array monodimensionali mentre considereremo matrici array multidimensionali. Se questi termini per ora vi spaventano non vi preoccupate, più avanti verranno chiariti.

Che cos'è un array

Veniamo al dunque: che cos'è un array?

In ASP possiamo considerare un array come un formato di dati corrispondente ad un elenco di elementi dove ogni elemento è contraddistinto da una coppia di chiave e valore.

Ad esempio, se prendiamo un array corrispondente alla lista dei mesi la lista di elementi sono i nomi dei mesi dove la chiave è il numero ed il valore è il nome del mese. Senza preoccuparci troppo dei valori l'anno

1 => gennaio
2 => febbraio
...
12 => dicembre

è il nostro primo array.

In ASP questa organizzazione di dati si trascrive come

anno(1) = gennaio
anno(2) = febbraio
...
anno(12) = dicembre

Come avrete capito anno è il nome dell'array, quello tra parentesi tonde è l'indice mentre a sinistra troviamo il valore che stiamo assegnando alla posizione dell'array.

Creare e popolare un array

Se provassimo subito a valorizzare una posizione di un array, come sopra, senza prima averlo definito ASP restituirebbe un errore poiché non è ancora stata allocata alcuna posizione di memoria per il nostro calendario. Per creare un array è necessario dichiararlo includendo nella dichiarazione il numero di posizioni da allocare - 1.

Dim anno(11)

Con la dichiarazione sopra abbiamo appena creato un anno di 12 posizioni. Se vi state chiedendo come mai di 12 quando vedete scritto 11 considerate che gli array partono sempre dall'indice 0. Di conseguenza gennaio sarà nella posizione anno(0) mentre dicembre anno(11).

Inoltre, al contrario di altri linguaggi di sviluppo maggiormente strutturati, il numero intero inserito in fase di dichiarazione non corrisponde al numero di elementi bensì all'ultimo indice disponibile nel nuovo array e, di conseguenza, a intero + 1 valori. Nel nostro caso anno(11) dichiara un array dove l'indice più altro è 11 ed il numero di elementi 12, ovvero da indice 0 a indice 11.

Di norma, una volta creato un array non è possibile cambiare il numero di indici assegnati. In ASP è possibile lavorare con array ridimensionabili.

Perché usare un array?

Se vi dicessi "perché sono comodi e vi semplificano la vita" è probabile che qualcuno non mi crederebbe. Vediamo se riesco a rendere meglio l'idea con un esempio.

Torniamo al nostro anno di prima. Utilizzando variabili normali quasi certamente avreste scritto una cosa del tipo

strMese1 = Gennaio
intMese1 = 1
strMese2 = Febbraio
intMese1 = 2

e così via per ogni mese dell'anno fino ad arrivare ad avere una lista di 24 scomode variabili solo per creare un anno. Ma questo è solo l'inizio. Immaginate di dover creare un menu a tendina con tutti i mesi dell'anno. Nel vostro script avreste dovuto scrivere una cosa tipo:

<select name="anno">
<option value="<%= intMese1 %>"><%= strMese1 %></option>
<option value="<%= intMese2 %>"><%= strMese2 %></option>
...
</select>

Per fortuna che vi hanno commissionato uno script su un calendario mensile. Cosa succederebbe se domani il vostro capo ufficio vi chiedesse la stessa cosa però con l'elenco dei 540 dipendenti per gestire gli orari di lavoro?

Utilizzando un array il codice prima diventerebbe:

<select name="anno">
<% for ii = 0 to Ubound(anno) %>
<option value="<%= ii + 1 %>"><%= anno(ii) %></option>
<% next %>
</select>

Lo stesso discorso vale anche per la lista dei vostri 539 colleghi. Comodo vero?

Manipolazione di array

Abbiamo definito di array come elementi composti da una coppia di chiave e valore. La chiave è un numero intero non negativo da 0 a infinito che non può essere variato. Il valore in ASP può essere un qualsiasi tipo di dati non necessariamente omogeneo. Alcune posizioni potranno contenere interi, altre valori booleani e così via. Tuttavia, si sconsiglia di mischiare il formato dei valori in uno stesso array.

Dato che gli indici sono interi è possibile scorrere un array utilizzando contatori per incrementare e decrementare il numero corrispondente. È possibile assegnare un valore ad una posizione di un array. E' possibile rimuovere un valore da una posizione ma non la rispettiva posizione. Per completare l'operazione sarebbe necessario utilizzare un array ridimensionabile ma si tratta di un argomento avanzato che non tratteremo in questo articolo.

Per assegnare un valore ad un array si procede come per una qualsiasi variabile ricordandosi di specificare la posizione dell'indice.

calendario(3) = "Pamela" ' costante
calendario(5) = strUltimaModella ' variabile

Una volta assegnato un valore è possibile sostituirlo

calendario(3) = calendario(5) ' assegna un'altra posizione. NB. La pos. 5 resta inalterata
calendario(3) = strSecondaModella

oppure cancellarlo

calendario(3) = null
calendario(5) = empty

Vedremo le operazioni fondamentali che è possibile eseguire sugli array ed alcuni algoritmi più elaborati.

Dopo aver introdotto le caratteristiche generali di vettori e matrici, vediamo in seguito le principali operazioni che possono essere eseguite sugli array.

Funzioni per array

ASP e VBscript mettono a disposizione una serie di funzioni specifiche per gli array, oltre alle solite per la manipolazione di tipo di dati semplici.

Ubound(array)

Restituisce l'intero corrispondente all'indice massimo dell'array. Nel caso del prima esempio Uboun(anno) forniva come risultato 11.

Lbound(array)

Restituisce l'intero corrispondente all'indice minimo dell'array che comunque corrisponde a 0.

Dim e ReDim

Consentono di dichiarare e ridimensionare un array. In aggiunta, l'operatore preserve consente di mantenere i dati già presenti nell'array nel caso di ridimensionamento degli indici.

Al contrario di altri linguaggi più evoluti, ASP non offre particolari funzioni per ordinare, unire, separare e filtrare i valori. Ovviamente non c'è da scoraggiarsi poiché è comunque possibile crearsele. Nelle righe successive vedremo alcuni esempi.

Scorrere un array

Considerando le funzioni prima elencate e combinandole con i costrutti di iterazione di ASP possiamo cominciare a creare qualcosa di più complesso con gli array.

Il primo esempio è già stato pubblicato nelle prime righe di questo articolo. Immaginiamo di avere un array di nome anno con 12 posizioni da 0 a 11 contenenti come valore i mesi dell'anno. Per stamparli tutti è sufficiente scorrere l'array da 0 alla posizione massima ed utilizzare la variabile di scorrimento come indice dell'array.

<select name="anno">
<% for ii = 0 to Ubound(anno) %>
<option value="<%= ii + 1 %>"><%= anno(ii) %></option>
<% next %>
</select>

Alcune varianti

Immaginiamo di voler stampare i mesi a due a due. Ci sono diversi modi. Quello più complesso consiste nel verificare l'indice dell'array. Se dispari apriamo la select, se pari la chiudiamo.

Siccome vogliamo impegnare meno risorse possibili possiamo saltare direttamente le posizioni a due a due:

<select name="anno">
<% for ii = 0 to Ubound(anno) step 2 %>
<option value="<%= ii + 1 & "-" & ii + 2 %>"><%= anno(ii) & " - " & anno(ii + 1) %></option>
<% next %>
</select>

Allo stesso modo, possiamo stampare i mesi al contrario semplicemente scorrendo l'array all'indietro:

<select name="anno">
<% for ii = Ubound(anno) to 0 step -1 %>
<option value="<%= ii + 1 %>"><%= anno(ii) %></option>
<% next %>
</select>

Algoritmi più elaborati con array

Quello che avete visto fino ad ora è praticamente nulla in confronto alla reale potenza degli degli array.

Immaginate di avere una lista di prodotti di un catalogo. Vi viene richiesto di cancellare gli elementi doppi e di fornire la lista di entrata ordinata in uscita.

Niente di più facile direte voi. Con qualche ORDER BY, DELETE ed UPDATE con un database ve la cavate in poche righe di codice. Questo è vero, ma siccome il vostro capo ufficio di prima, ancora contento che voi abbiate elencato tutti i 540 dipendenti in qualche minuto, ha molta stima di voi vuole mettervi alla prova e vi fornisce tutti i prodotti su un semplice file di testo senza mettervi a disposizione alcun database... Panico!

Qualche secondo, un profondo respiro e cominciamo a valutare la situazione. Per prima cosa è necessario leggere il file ed inserire ogni riga, ovvero ogni prodotto, in una posizione dell'array.

Non riporto in seguito il codice poiché è molto semplice: con l'oggetto FSO (File System Object) si apre in file il lettura e si legge riga per riga inserendo i valori in un array temporaneo che per comodità avremo inizialmente dichiarato con un numero sufficiente di posizioni.

A questo punto è importante sapere che un array ordinato è molto più facile da gestire di uno non ordinato e, soprattutto, gli algoritmi di ricerca e filtro lavorano molto più velocemente.

Riordiniamo dunque il nostro array. Procediamo con il noto algoritmo selection sort che lavora in questo modo: cerca l'elemento più piccolo nella parte di vettore non ordinata, scambialo con il primo non ordinato e riesegui fino a che l'array non è completo.

aryEsempio = Array(356, 35, 2352, 1667, 35)

' procedi per l'intero array
for ii = 0 to Ubound(aryEsempio - 1)

' trova il minimo
intMin = ii
for jj = ii + 1 to Ubound(aryEsempio)
if aryEsempio(jj) < aryEsempio(intMin) then intMin = jj
next

' scambia il minimo con l'attuale
tmp = aryEsempio(ii)
aryEsempio(ii) = aryEsempio(intMin)
aryEsempio(intMin) = tmp

next

Il risultato finale dell'algoritmo selection sort è un array ordinato in ordine crescente secondo il valore del prodotto.

A questo punto è molto più semplice individuare i doppioni. Sarà sufficiente scorrere l'array e controllare ogni elemento in posizione ii con quello nella posizione successiva. Se coincidono si elimina un valore.

Anche in questo caso possiamo procedere con un array di appoggio o eseguire tutta l'elaborazione sull'array principale. In entrambi i casi è utile tenere una variabile che ci segnali il numero di posizioni dell'array occupate, a meno di non eseguire un ridimensionamento dell'array. Per semplificare il codice vediamo la prima ipotesi:

intSize = 0 ' dimensioni dell'array risultato

for ii = 0 to Ubound(aryEsempio - 1)
if aryEsempio(ii) <> aryEsempio(ii + 1) then
aryResults(intSize) = aryEsempio(ii)
intSize = intSize + 1
end if
next

Come risultato avremo che tutti gli elementi nell'array di partenza sono stati copiati in quello di destinazione in una posizione da 0 fino a intSize - 1 dove intSize corrisponde al numero di elementi nell'array.

Nell'esempio lo scorrimento avviene fino a Ubound -1 poiché ogni elemento è confrontato con il successivo e non c'è modo di confrontare l'ultimo elemento della lista poiché sarà comunque sempre da inserire.

Se infine il vostro capo vi chiede di creare un sistema di ricerca tra i prodotti, anche in questo caso un array ordinato consentirà di risparmiare tempo e risorse. È possibile sfruttare l'algoritmo di ricerca binaria, il più efficiente algoritmo di ricerca attualmente esistente su array ordinati.

Conclusioni

Non è difficile accorgersi già da queste poche righe di come sia utile utilizzare gli array nella creazione di script anche non necessariamente molto complessi. Gli permettono di semplificare notevolmente operazioni su elenchi di valori e consentono di modellare i dati in modalità che non sarebbero disponibili altrimenti.

Ad esempio, si può gestire una paginazione dei file di una cartella, l'ordinamento delle directory di un sito, l'estrazione di record e molte altre operazioni.

Se ancora non vi siete avvicinati agli array non spaventatevi ma cominciate a familiarizzare con questo utile tipo di dati.

Ti consigliamo anche