• User Attivo

    Problema script assenze

    Salve :ciauz:

    Stavo cercando di fare uno script che mi permetta di segnare giornalmente (anche attraverso il codice) le presenze e assenze assegnate a dei nomi che di volta in volta possono essere tolti e aggiunti.. Quindi la lista viene disordinata nel codice e per metterla in ordine alfabetico ho usato sort().
    I nomi li meto in un array, ma il problema è che se aggiungo un altro array con i dati ordinati come quelli del codice dell'array precedente, poi si vede la tabella con i nomi ordinati in ordine alfabetico ma i dati sotto sulle presenze e assenze sballati perche non s muovono insieme al nome, spero di essermi spiegato.. vi posto il codice:

    [PHP]
    <table>
    <?php
    $elenco_utenti=array("Tizio","Caio","Sempronio","Mevio","Filano","Calpurnio");
    $assenze1=array("A","P","P","P","P","A");
    $assenze2=array("P","P","A","A","P","P");
    sort($elenco_utenti);
    $flag_colore=0;
    for($i=0;$i<6;$i++){
    if($flag_colore==0){
    echo "<tr><td bgcolor="#008000">$elenco_utenti*</td><td bgcolor="#008000">$assenze1*</td><td bgcolor="#008000">$assenze2*</td></tr>";
    $flag_colore=1;
    }
    else{
    echo "<tr><td bgcolor="#808080">$elenco_utenti*</td><td bgcolor="#008000">$assenze1*</td><td bgcolor="#008000">$assenze2*</td></tr>";
    $flag_colore=0;
    }
    }
    ?>
    </table>
    [/PHP]

    Sapete dirmi come potrei risolvere? Credo il codice non sia dei migliori, però è quello che sono riuscito ad abbozzare..

    Grazie mille


  • User

    In questo caso ti conviene fare un array associativo del tipo:

    [PHP]
    $elenco_utenti['Tizio'][Ass1] = 'A';
    $elenco_utenti['Tizio'][Ass2] = 'P';
    $elenco_utenti['Caio'][Ass1] = 'P';
    $elenco_utenti['Caio'][Ass2] = 'P';
    $elenco_utenti['Sempronio'][Ass1] = 'P';
    $elenco_utenti['Sempronio'][Ass2] = 'A';
    ...
    [/PHP]

    e poi per ordinare fai il ksort (che ordina a seconda dell'indice -in questo caso i nomi-) ed un foreach/for per ciclare...


  • User Attivo

    Sto provando in tutti i modi, ho visto anche su google ma in tutti i siti è spiegato con:

    $elenco_utenti['Tizio'] = 'A';

    Senza la parte in più [Ass1] ecc.., sto andado abbastanza in confusione, provo a lasciare per qualche oretta così magari sono più lucido, poi se avete tempo e potete darmi una mano in più forse entro 1 mese c'è la faccio :bigsmile:
    Oppure se ci sono guide che riprendono il codice simile almeno lo caisco megli senza disturbarvi troppo mi va sempre benissimo..

    Grazie mille!


  • User

    In realtà gli array multidimensionali in PHP sono di un'utilità impressionante.

    E la bellezza di questi è che puoi crearli come meglio credi.

    Nel tuo caso, visto che tu hai necessariamente bisogno di due campi 'Assenza1' ed 'Assenza2', puoi usare perfettamente l'esempio che ti ho fatto io:

    [php]
    $elenco_utenti['Tizio'][Ass1] = 'P';
    $elenco_utenti['Tizio'][Ass2] = 'A';
    /* In questo caso, Tizio è l'indice dell'array $elenco_utenti, Ass1 e Ass2
    sono i due campi riferiti all'indice 'Tizio' e P, A sono i valori associati ad
    Ass1 di Tizio e Ass2 di Tizio. */[/php]Diciamo che puoi prenderli in considerazione come se fossero un mini.db (ovviamente solo in questo caso)

    Ad esempio:
    [php]
    Tabella = ElencoUtenti
    ID | Ass1 | Ass2
    'Tizio' | 'P' | 'A'
    [/php]Spero di essermi spiegato!!


  • User Attivo

    Quindi con quel tipo di array il primo valore, ne nostro caso Tizio, è sempre associato all'ID, mentre quello tra le parentesi quadre è come una suddivisione di questo in più parti, in questcaso Ass1 e Ass2 che poi hanno ognuno un proprio dato.. giusto?

    Comunque per rendere meglio la cosa, perchè prima ho cercato di non allungare troppo:

    In pratica devo controllare circa 100 utenti, e per ognuno devo segnare le assenze degli ultimi 7 giorni, quindi i valori da 2 passano a 7, che poi dovrebbero darmi solo gli ultimi 7 valori per ogni membro.

    Poi qusto me l'ero segnato come primo passo, per poi provare a fare in modo che direttamente dal browser davanti alla pagina stessa, i valori "A" (Assente) e "P" (Presente) vengono sostituiti con delle immagini, e che una volta cliccate, queste cambiano il dato nello script (quindi lo scrip dovrebbe funzionare anche da database su file php).

    Per non incasinarmi troppo ero partito dicendo che bastava avere una base dove la modifica avveniva solo attraverso codice, ma come si può notare ho già qualche difficoltà, ora ho scritto il tutto non per farmi fare lo script, perchè vorrrei farlo io passo passo per capirlo, ma in modo che chi spreca tempo a darmi le indicazioni sappia già un po cosa ho in mene, per non andare tutti insieme fuori strada.

    Tornando al codice, io prima avevo utlizzato sort($elenco_utenti), ho provato utilizzando ksort() allo stesso modo ma non funziona, evidentemente perchè funziona in modo diverso, su internet ho trovato questo con foreach:

    [PHP]ksort($elenco_utenti);
    foreach ($elenco_utenti as $chiave => $valore) {
    echo "$chiave = $valore\n";
    }
    [/PHP]

    E' questo che serve a me?
    Però non capisco da dove prende le due variabili $chiave e $valore.. che dovebbero essere nel mio script, penso, il nome utente e il valore dell'assenza o meno.


  • User

    Allora..

    Partiamo da prima al codice...
    il codice in teoria da usare è similare:

    [php]
    $elenco_utenti['Tizio'][Ass1]='P';
    $elenco_utenti['Tizio'][Ass2]='P';
    $elenco_utenti['Caio'][Ass1]='A';
    $elenco_utenti['Caio'][Ass2]='A';
    $elenco_utenti['Sempronio'][Ass1]='A';
    $elenco_utenti['Sempronio'][Ass2]='P';
    $elenco_utenti['Altro'][Ass1]='P';
    $elenco_utenti['Altro'][Ass2]='A';

    ksort($elenco_utenti);

    foreach($elenco_utenti AS $K => $V){
    echo "La prima assenza dell'utente ".$K." è ".$elenco_utenti[$K][Ass1]."\n";
    echo "La seconda assenza dell'utente ".$K." è ".$elenco_utenti[$K][Ass1]."\n";
    }
    [/php]Poi ovviamente, riferito alla descrizione, puoi benissimo sostituire P o A con un link all'immagine!

    ad esempio:

    [php]
    ksort($elenco_utenti);

    foreach($elenco_utenti AS $K => $V){
    echo "<img src='http://".$elenco_utenti[$K][Ass1]."' />\n";
    echo "<img src='http://".$elenco_utenti[$K][Ass1]."' />\n";
    }
    [/php](Il ksort funziona comunque!)


  • User Attivo

    Ottimo, fino a qua ci siamo, questo il risultato:

    provanuke.altervista.org/assenze.php

    Qui il sorgente (non vorrei fosse troppo lungo da postare qui in forum):

    provanuke.altervista.org/assenze.txt

    Ora si capisce già meglio cosa ho in mente.

    La parte di codice nel foreach posso anche modificarla maualmente ogni giorno, una volta arrivto al settimo, cambiando questo:
    [PHP] <td>".$elenco_utenti[$K][Ass1]."</td>
    <td>".$elenco_utenti[$K][Ass2]."</td>
    <td>".$elenco_utenti[$K][Ass3]."</td>
    <td>".$elenco_utenti[$K][Ass4]."</td>
    <td>".$elenco_utenti[$K][Ass5]."</td>
    <td>".$elenco_utenti[$K][Ass6]."</td>
    <td>".$elenco_utenti[$K][Ass7]."</td>[/PHP]

    Con questo:
    [PHP] <td>".$elenco_utenti[$K][Ass2]."</td>
    <td>".$elenco_utenti[$K][Ass3]."</td>
    <td>".$elenco_utenti[$K][Ass4]."</td>
    <td>".$elenco_utenti[$K][Ass5]."</td>
    <td>".$elenco_utenti[$K][Ass6]."</td>
    <td>".$elenco_utenti[$K][Ass7]."</td>
    <td>".$elenco_utenti[$K][Ass1]."</td>[/PHP]

    E facendo lo stesso lavoro con le date in alto, ci metterei 1 minuto..
    Solo che sarebbe complicato una volta arrivato sui 100 utenti, modificare lo stato direttamente dal codice, quindi quello ch avevo in mente è rendere le scritte "presente" e "assente" dei link, che se cliccati fnno ricaricare la pagina stampando il valore opposto a quello precedente, quindi passando da assente a presente e viceversa. Quindi dovrebbe essere un cambio che si verifica anche nello script, penso servano a questo punto dei comando simili a qelli di un database no?


  • User

    Beh gli array non hanno comandi particolari,

    una volta che hai ricavato la posizione di dove andare a modificarlo basta che fai
    $elenco_utenti[$X][AssY] = 'Z';


  • User Attivo

    @il_gege said:

    [***]

    Devo quindi ricavare le coordinate di ogni dato?
    Scusa ma guardando quel codice non ci arrivo..


  • User

    Si, ogni array ha il suo sistema di coordinate che gestisci te tramite il post del link che cliccherai.

    Tipo
    [php]
    foreach($elenco_utenti AS $K => $V){
    for($I = 1; $I < 8; $I++){
    echo "<a href='thispage.php?IDUtente=$K&Ass=Ass".$I."'>".$elenco_utenti[$K][Ass.'$I']."</a>";
    }
    }
    [/php]Una volta che clicchi sul link poi avrai un recupero del genere:

    [PHP]
    $IDUtente = $_REQUEST['IDUtente'];
    $Ass = $_REQUEST['Ass'];

    if($elenco_utenti[$IDUtente][$Ass] == 'P') $elenco_utenti[$IDUtente][$Ass]= 'A'; else $elenco_utenti[$IDUtente][$Ass]= 'P';
    [/PHP]