Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922

    [Pillola] Introduzione agli array.

    Pillolina. Introduzione agli array .
    Ciao a tutti. Ho guardato la sezione relativa alle pillole e mi sono reso conto che non esiste un piccolo vademecum per la gestione degli array. Ho deciso pertanto di scriverne uno io, soprattutto per i neofiti al fine di chiarire alcuni concetti tipo come faccio a stampare il contenuto dell'array, come recupero le checkbox da un form, ecc.
    Essendo la mia prima pillola, per quanta cura possa metterci, chiedo ai forumisti più navigati di avere pazienza ed evidenziare eventuali errori.

    Che cos'è un array.
    Iniziamo. Prima di tutto cos'è un array.

    Un array non è altro che una variabile che contiene più valori.
    Ci addentreremo dopo nei dettagli.

    Per dichiarare un array si ricorre per l’appunto al costrutto array().
    $nomi = array (“Nicola”,”Mario”,”Giuseppe”, “Franco”);
    $numeri = array(10,20,25,13,8);
    Abbiamo in questo modo definito due array tramite un assegnamento esplicito di variabili.
    Da notare che l’array $nomi contiene delle stringhe, tant’è vero che i nomi sono stati racchiusi tra virgolette, mentre $numeri contiene valori interi e dunque le virgolette non sono necessarie.

    Come si accede agli elementi?
    Gli elementi di un array sono accessibili tramite un indice.
    Ciò significa che “Nicola” sarà il contenuto di $nomi[0], “Mario” di $nomi[1], “Giuseppe” di $nomi[2] ed infine Franco di $nomi[3].

    Da notare che, qualora non venga specificato, l’indice parte da 0 come nel nostro caso.
    Qualora volessimo che $nomi parta da 1 anziché da 0 sarà sufficiente modificarlo così:

    $nomi_indice_1 = array (1=>“Nicola”,”Mario”,”Giuseppe”, “Franco”);
    Si può vedere come sia sufficiente definire il valore di partenza, infatti qualora l’indice sia un intero, i valori successivi avranno indici progressivi (con passo d’incremento pari a 1).
    Dunque ora “Nicola” si troverà in $nomi_indice_1[1] fino ad arrivare a Franco che sarà in $nomi_indice_1[4].

    Esiste anche un altro modo per definire un array (assegnamento implicito):
    $nomi = array(); //inizializziamo la nostra variabile
    A questo punto procediamo all’inserimento dei nostri valori tramite gli indici. Quindi:
    $nomi[0] = “Nicola”;
    $nomi[1] = “Mario”;
    $nomi[] = “Giuseppe”;
    $nomi[] = “Franco”;
    Nel caso di Giuseppe e Franco non abbiamo definito un indice. Ciò nonostante PHP provvederà per noi a collocare l’elemento dichiarato alla fine dell’array.

    Possiamo notare comunque come sia decisamente più comodo dichiarare un array come abbiamo fatto la prima volta.

    Lettua del contenuto di un array .
    Ok. Ho definito un array. Ma come ne esamino il contenuto adesso?
    Esistono diversi modi per “scorrere” un array.

    Il metodo più comodo è quello di ricorrere alla struttura foreach .
    Se ad esempio vogliamo esaminare il contenuto dell’array $nomi possiamo fare così:

    Codice PHP:
    foreach($nomi as $valore)
    echo 
    $valore"
    "

    dove $valore è un nome arbitrario che ho scelto io. Abbiamo così eseguito un loop sull’array.

    Se invece oltre ai valori volessimo recuperare anche i rispettivi indici di ciascun elemento la sintassi diventa:
    Codice PHP:
    foreach($nomi as $chiave => $valore)
    echo 
    $chiave" " $valore "
    "

    Provate questa struttura con i due array $nomi e $nomi_indice_1 e noterete come effettivamente l’indice di partenza sia in un caso 0 e nell’altro 1.

    Altro modo: utilizzo del ciclo for . Questo va bene solo qualora gli indici dell’array siano numerici e non presentino buchi, cioè siano tutti in sequenza. In questo caso possiamo fare:
    Codice PHP:
    Per l’array con indice iniziale 0
    for($i=0$i<sizeof($nomi); $i++)
    echo 
    $nomi[$i]. "
    "

    Per l’array con indice iniziale 1
    Codice PHP:
    for($i=1$i<=count($nomi_indice_1); $i++)
    echo 
    $nomi_indice_1[$i]. "
    "

    notare come le funzioni sizeof() e count() si equivalgono.

    Esiste un altro modo: l’utilizzo del ciclo while con la struttura list() = each().
    Personalmente non la utilizzo quasi mai perché trovo più agevole il foreach. Però è bene sapere che esiste.
    Codice PHP:
    while ( list($chiave,$valore) = each($nomi) )
    echo 
    "$chiave$valore 
    "

    Funzioni relative agli array.
    Php mette a disposizione una vasta gamma di funzioni relative agli array. Ovviamente non è questo il luogo più indicato a elencarle tutte.
    Prenderemo in considerazione quelle di utilizzo più frequente.

    - Voglio aggiungere un elemento al mio array:
    array_push($nomi,"Stefano"); Questa funzione accoderà all’array $nomi il nome Stefano.

    - Voglio recupare l’ultimo elemento:
    $ultimo = array_pop($nomi);
    Se diamo un echo alla variabile $ultimo vedremo che in effetti contiene “Stefano” e che l’array $nomi è stato accorciato, privandolo dell’ultimo valore.
    Facendo così siamo tornati alla situazione iniziale, quella precedente alla funzione array_push. Stefano è ora scomparso (dall’array $nomi intendo).

    - Voglio sapere il numero di occorrenze (cioè quante volte si ripete) di ciascun valore:
    array_push($nomi,”Mario”); // mi serve per l’esempio. Non è questa la funzione.
    var_dump(array_count_values($nomi));
    In questo caso abbiamo prima inserito un nuovo elemento nell’array. Con la funzione array_count_values() calcoliamo le nostre occorrenze. Avremo tutti i valori pari a 1 tranne Mario che sarà pari a 2.
    La funzione var_dump recita testuale il manuale ufficiale “visualizza delle informazioni strutturate riguardanti un’espressione, tra cui il suo tipo e il suo valore”.
    Risulta essere molto utile in fase di debug. Allorché effettuiamo un’operazione sugli array sarebbe scomodo ogni volta dover fare un ciclo per “echare” la variabile.
    Così invece abbiamo un immediato riscontro di ciò che contiene. Questo è l’output del mio var_dump:
    array(4) { ["Nicola"]=> int(1) ["Mario"]=> int(2) ["Giuseppe"]=> int(1) ["Franco"]=> int(1) }

    - Quanto è lungo il mio array:
    come detto in precedenza si può usare count() oppure sizeof().

    Come faccio ad eliminare i doppioni?
    $animali = array("cane","cane","gatto","cavallo","leone");
    $animali_diversi = array_unique($animali);
    sort($animali_diversi);

    La funzione array_unique elimina i doppioni e, come è giusto che sia, mantiene le chiavi.
    Molto spesso nel forum la gente chiede come rendere contigui gli indici una volta eliminati i doppioni. Semplicemente si usa la funzione sort() e le chiavi dei valori diventeranno 0,1,2,3 ecc.
    In realtà non abbiamo “tappato i buchi” ma semplicemente riordinato.
    La soluzione migliore sarebbe questa:
    $nuovo_animali_diversi = array();
    foreach($animali_diversi as $animale)
    $nuovo_animali_diversi[] = $animale;
    In pratica non facciamo altro che inizializzare un nuovo array, ciclare il precedente e mettere nel nuovo tutti i valori contenuti nel vecchio.

    Voglio crearmi un’array di numeri da 1 a 100. Li devo scrivere uno per uno?
    In questo caso ci viene in soccorso la funzione range().
    $valori = range(1,10);
    E’ decisamente più comodo che scriverli uno per uno. L’altra possibilità sarebbe stata un ciclo for.
    Codice PHP:
    for($i=1;$i<=100;$i++)
    {
    $numeri_da_1_a_100[$i] = $i;
    echo 
    $numeri_da_1_a_100[$i]. "
    "
    ;

    Ma perché complicarsi la vita se php ce la semplifica?

    Altra funzione che si userà spesso è in_array.
    Come il nome lascia intuire permette di verificare se un valore è presente nell’array.
    Semplice esempio:
    Codice PHP:
    $forum = array("ASP""PHP""HTML""Reti");
    if (
    in_array("ASP"$forum)) 
       echo 
    "Il forum c'è.";
     else
       echo 
    “Il forum non c’è.
    Gli array di PHP si dividono in array scalari e array associativi.
    In realtà ciò non è propriamente esatto, visto che fondamentalmente php considera e gestisce tutti gli array come associativi.
    Ad esempio, quando abbiamo definito l'array $nomi con il suo contenuto, abbiamo visto come php assegni chiavi numeriche partendo da zero.

    Recupero di array tramite form.
    Sono molto frequenti i post in cui gli utenti hanno difficoltà a recupare le informazioni inviate tramite form e che devono restituire più di un unico risultato. Mi riferisco alle checkbox e alle select che consentono scelte multiple. Supponiamo di avere un form del genere che ci chieda i nostri colori e sport preferiti.

    Rosso<input type="checkbox" name="colore[]" value="rosso">

    Verde<input type="checkbox" name="colore[]" value="verde">

    Giallo<input type="checkbox" name="colore[]" value="giallo">

    Blu<input type="checkbox" name="colore[]" value="blu">


    <select name="sport[]" multiple>
    <option value="calcio">calcio</option>
    <option value="basket">basket</option>
    <option value="tennis">tennis</option>
    <option value="pallavolo">pallavolo</option>
    </select>

    La cosa che desterà stupore agli occhi dei meno pratici è sicuramente la presenza delle parentesi quadre. Ciò serve a “mettere in guardia” PHP, nel senso che saprà di doversi attendere un array e non un singolo valore. Se le omettessimo, i checkbox si contenderebbero la scelta e alla fine verrebbe recuperata solo l’ultima tra quelle scelte (dove per ultima non si intende quella cronologicamente scelta ma l’ultima rispetto all’ordine del form.
    Per recupare i le preferenze dell’utente facciamo così:
    Codice PHP:
    if (isset($_POST['colore']))
    {
        
    $colori_preferiti $_POST['colore'];
        foreach(
    $colori_preferiti as $valore)
        {
        echo 
    $valore"
    "
    ;
        }
    }    
    else
    {
        echo 
    "Devi scegliere almeno un colore";

    Codice PHP:
    if (isset($_POST['sport']))
    {
        
    //$sport_preferiti = $_POST['sport'];
        
    $sport_preferiti implode(",",$_POST['sport']);
        echo 
    $sport_preferiti;
        
        foreach(
    $sport_preferiti as $valore)
        {
        echo 
    $valore"
    "
    ;
        }
    }    
    else
    {
        echo 
    "Devi scegliere almeno uno sport";

    Mentre nel caso dei colori abbiamo scelto di visualizzarli ciascuno in una riga, nel secondo caso abbiamo usato la funzione implode, che trasforma un array in una stringa, e li abbiamo concatenati tramite la virgola. Da notare come la virgola non compaia dopo l’ultimo elemento.
    Grazie all’implode possiamo ad esempio salvare in un unico campo di un db tutte le preferenze dell’utente. Ovviamente poi a seconda delle esigenze si deciderà come gestire tutti i dati passati.

    Si conclude qui questa breve introduzione. Ovviamente gli argomenti sono tanti. Tanto per dirne una sono stati fatti esempi solo di array monodimensionali mentre php consente di gestire senza difficoltà anche array a più dimensioni o matrici.

  2. #2
    BUMP
    Addio Aldo, amico mio... [03/12/70 - 16/08/03]

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    102
    ciao, il recupero dei checkbox con un array non mi funziona!!!

    Mi puoi aiutare
    grazie

  4. #4
    Originariamente inviato da caste1982
    ciao, il recupero dei checkbox con un array non mi funziona!!!

    Mi puoi aiutare
    grazie
    a prescindere che l'impossibile di solito nicola lo fa subito, ma nessuno ha proprieta' divinatorie.

    Meglio se apri un tuo thread ed esponi il tuo problema con un esempio dello script usato.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    102
    Scusami .. cmq ho creato un nuovo thread

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    102
    no, in teoria cosi è giusto! E poi non potrei dare un nome di campo diverso per ognuno perchè il tutto è dinamico.
    In teoria i checkboxs dovrebbero essere memorizzati in un array e quando li passo nel post mi da sempre l'ultimo, quindi sicuramente sbaglierò qualcosa, ma non riesco a capire cosa sbaglio.
    Ho provato con il foreach e non funziona. Mi restituisce sempre l'ultimo della lista.

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    1

    Un consiglio per creare un modulo che gestisca selezioni multiple

    Il progetto da realizzare:
    Sto creando un sito per commercio elettronico, basato su OsCommerce.com, che dovrà gestire il pagamento di alcuni prodotti fisici (che verranno spediti a casa) e anche dell'eventuale iscrizione al portale.

    In super sintesi il problema è che avrei voluto :
    - aggiungere nuovi dati , partendo da una pagina già esistente ed autenticata, inserendo nel database i dati relativi alle varie tabelle di cui molte grazie a select option multiple, vale a dire menu a scelta multipla
    - creare una nuova pagina in cui poter modificare i dati ripresentando a video i dati forniti.
    Il codice che ho per partire è di 11 pagine, contando i vari file inclusi diventano una cinquantina abbondante. Un cinquantinaio.

    PEr ora, anche se modificato, funziona tutto, i codici di login logout, il carrello. Tutto perfetto. Ho usato l'ultima release di OsCommerce ed ho riscritto parti di codice per adattarlo alle scelte del mio committente (che a volte mi sconvolge con la facilità con la quale è convinto si possano fare variazioni enormi sul tema).

    Ora devo modificare un form di inserimento nuovi dati ed il realtivo script per gestirlo:
    si tratta di un form che risiede in una pagina già autenticata che ha una serie di campi a tendina a scelta multipla, nel quale l'utente potrà inserire i dati che verranno memorizzati in tabelle diverse.

    Nel form ci sono vari questiti per esempio ho "Tipo sport praticati" e giù la lista di trecento sport possibili, selezionabili anche molti per volta, poi preferenze geografiche (e anche qui si aprono venti possibilità, tutte anche contemporanee) e così via.

    Che faccio, inserendo tutto in un array poi posso memorizzare l'intero array in un campo di tabella? E per estrapolarne il contenuto riassegno al modulo i dati dell'array con un foreach?

    I guai per me sono cominciati quando ho cercato di usare i menu con scelte multiple. Prima il form aveva funzionato sempre bene, nonostante la gestione delle variabili e delle funzioni sia incasinatissima (ci sono una marea di file inclusi nel mio template da modificare ad ogni aggiunta... una cosa mostruosa.)

    Mi conviene utilizzare un form nuovo di zecca che nonho ancora idea di come fare, vorrei che mantenesse i tremila riferimeni alle altre pagine, quindi se qualcuno si è già cimentato sono qui.

    La questione fondamentale riguarda i menu a scelta multipla che accedono ad altrettante tabelle :berto:

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.