Visualizzazione risultati 1 fino 17 di 17

Discussione: Escludere variabile da ciclo while

  1. #1
    pukas non è connesso Utente
    Data registrazione
    03-04-2003
    Messaggi
    123

    Predefinito

    io ho un ciclo while in in sendmail in php...
    vorrei escludere l'ultima accoppiata key=val da ciò che viene scritto nella mail,come fare?

  2. #2
    Guest

    Predefinito

    Non ho ben capito, ma cerco di interpretare:
    hai un array di n valori, vuoi processare tutti i valori dell'array tranne l'ultimo, fermandoti quindi a n-1 valori.

    Se questa interpretazione del quesito è corretta, puoi duplicare l'array in uno temporaneo ed utilizzare su questo la funzione array_pop che "sfila" dall'array l'ultimo elemento. Prova questo codice

    [code:1:462d1fc427]$test_array = array ('1', '2', '3', '4');
    $temp_array = $test_array;
    $pop = array_pop ($temp_array);
    foreach ($temp_array as $val){
    print ($val . "<br>");
    }
    print ("<br>");
    foreach ($test_array as $val){
    print ($val . "<br>");
    }
    [/code:1:462d1fc427]

    quando stampi $temp_array (ovvero quello a cui è stato sfilato l'ultimo elemento) ottieni 1 2 3
    quando stampi quello originale, invece, ovvero $test_array ottieni sempre l'array iniziale 1 2 3 4
    Da qui nasce quindi la necessità di duplicare l'array, perchè array_pop ne modifica il contenuto in modo permanente.

    Spero di essere stato utile :o

  3. #3
    pukas non è connesso Utente
    Data registrazione
    03-04-2003
    Messaggi
    123

    Predefinito

    mmmmmm...oddio
    io sono un neofita...è da una settimana che sto smanettando sul php....

  4. #4
    Guest

    Predefinito

    quindi? :o
    Anche volendo (e non voglio :p) non potrei scriverti un codice completo. Magari prova a descrivere a parole ciò che vorresti fare che ci capiamo, oppure se hai già un po' di codice prova a postarlo :)

  5. #5
    pukas non è connesso Utente
    Data registrazione
    03-04-2003
    Messaggi
    123

    Predefinito

    <?
    if (!is_array($HTTP_POST_VARS))
    return;
    reset($HTTP_POST_VARS);
    while(list($key, $val) = each($HTTP_POST_VARS)) {
    $GLOBALS[$key] = $val;
    $val=stripslashes($val);
    echo "<FONT COLOR=red><b>$key</b> = </FONT>$val<br> ";
    $Message .= "$key = $val\n";
    }

    if ($Header) {
    $Message = $Header."\n\n".$Message;
    }

    if ($Footer) {
    $Message .= "\n\n".$Footer;
    }

    mail( "$MailToAddress", $subject, "$Message", "From: $MailFromAddress");
    ?>


    questo è il pezzo dove c'è il ciclo...
    io voglio che non mi comapaia nella mail B1=Invia
    che sarebbe il tasto invia....

  6. #6
    Guest

    Predefinito

    adesso ho capito! Allora direi che il metodo che ti ho suggerito risulta difficilmente applicabile, bisogna pensare a qualcos'altro. Sparo un'idea, non è detto che sia la migliore:

    intanto da PHP 4.1.0 conviene usare $_POST al posto di $HTTP_POST_VARS. $_POST è un array che contiene tutti gli elementi passati alla pagina attraverso un metodo post, appunto. Ora, la funzione unset() ti permette di eliminare una variabile, o anche un singolo elemento da un array. Ti consiglio quindi:

    1) duplichi l'array $_POST (per non modificare l'originale, nel caso ti serva ancora). Diciamo che il duplicato lo chiami $MIO_POST
    2) elimini da $MIO_POST la chiave B1, semplicemente con unset($MIO_POST['B1']);
    3) lasci tutto il codice che hai scritto tu, mettendo però $MIO_POST al posto di $HTTP_POST_VARS.

    Riassumendo, in cima scrivi:
    [code:1:acfbe94525]<?
    if (!is_array($POST)) return;
    $MIO_POST = $POST;
    unset($MIO_POST['B1']);[/code:1:acfbe94525]

    dopo di che metti tutto il tuo codice che c'era prima partendo da reset e sostituendo ovunque lo trovi $HTTP_POST_VARS con $MIO_POST

    Credo che potrebbe funzionare. Forse :o

  7. #7
    L'avatar di gve
    gve
    gve non è connesso Utente storico
    Data registrazione
    26-01-2003
    Residenza
    Brescia
    Messaggi
    2,964

    Predefinito

    E' tuo il codice? Secondo me è un po' inutilmente contorto.

    Prima cosa, ti conviene usare $_POST al posto di $HTTP_POST_VARS , come dice anche bodo . Essendo un neofita dovresti aver trovato che è meglio nel manuale php.

    Citazione Originalmente inviato da pukas
    if (!is_array($HTTP_POST_VARS))
    Non serve a niente, $HTTP_POST_VARS se c'è è un array (se non lo hai fatto diventare tu qualcos'altro). Al più può essere utile controllare if(isset($HTTP_POST_VARS)).

    Se usi $_POST anche la riga$GLOBALS[$key] = $val; diventa superflua.

    Per quanto riguarda la domanda io farei così, senza duplicare l'array ma usando count() (che ti dice di quanti elementi è composto l'array) e un ciclo for al posto del while. Modifico nel tuo post:
    [code:1:c701e14ebf]
    if (!isset($_POST)) return;
    reset($_POST);

    for($i=0;$i<(count($_POST)-1);$i++) {
    list($key, $val) = each($_POST);
    $val=stripslashes($val);

    echo "<FONT COLOR=red><b>$key</b> = </FONT>$val<br> ";
    $Message .= "$key = $val\n";
    }

    if ($Header) {
    $Message = $Header."\n\n".$Message;
    }

    if ($Footer) {
    $Message .= "\n\n".$Footer;
    }

    mail( "$MailToAddress", $subject, "$Message", "From: $MailFromAddress");
    ?>[/code:1:c701e14ebf]

    Ovviamente può darsi ci sia un modo migliore, a me questo sembra buono.
    | Regolamento del Forum | Regolamento di AlterVista | FAQ di AlterVista | Netiquette |

    GVE = GVE Virtual Extension
    AVCM #: 6637

  8. #8
    Guest

    Predefinito

    Ottimo metodo, signore :o

    (SPAM!)

  9. #9
    pukas non è connesso Utente
    Data registrazione
    03-04-2003
    Messaggi
    123

    Predefinito

    for($i=0;$i<(count($_POST)-1);$i++) {

    mi da errore in questa linea

  10. #10
    pukas non è connesso Utente
    Data registrazione
    03-04-2003
    Messaggi
    123

    Predefinito

    Codice:
    <?
    if (!is_array($POST)) return;
    $MIO_POST = $POST;
    unset($MIO_POST['B1']);


    al contrario questo funziona benissimo!grazie

    ora un'altra domanda, per inserire nella mail uno spazio tra una key e quella successiva?

  11. #11
    L'avatar di gve
    gve
    gve non è connesso Utente storico
    Data registrazione
    26-01-2003
    Residenza
    Brescia
    Messaggi
    2,964

    Predefinito

    Citazione Originalmente inviato da pukas
    for($i=0;$i<(count($_POST)-1);$i++) {

    mi da errore in questa linea
    L'errore non è in quella riga ma in quella sotto, dove manca un ; alla fine (ora ho corretto nel post e dovrebbe andare, chiedo scusa ma avevo fatto di corsa).

    Comunque ho notato poi che forse il codice potrebbe dare problemi se l'array è composto da solo 1 o 2 elementi (non ne sono sicuro, ma potrebbe). Quindi forse in definitiva è meglio il codice di bodo (o bisognerebbe provare ...).
    | Regolamento del Forum | Regolamento di AlterVista | FAQ di AlterVista | Netiquette |

    GVE = GVE Virtual Extension
    AVCM #: 6637

  12. #12
    L'avatar di gve
    gve
    gve non è connesso Utente storico
    Data registrazione
    26-01-2003
    Residenza
    Brescia
    Messaggi
    2,964

    Predefinito

    Citazione Originalmente inviato da pukas
    ora un'altra domanda, per inserire nella mail uno spazio tra una key e quella successiva?
    Cioè? se intendi una riga basta che aggiungi un "\n", cioè dove c'è
    $Message .= "$key = $val\n";
    metti
    $Message .= "$key = $val\n\n";
    | Regolamento del Forum | Regolamento di AlterVista | FAQ di AlterVista | Netiquette |

    GVE = GVE Virtual Extension
    AVCM #: 6637

  13. #13
    Guest

    Predefinito

    Citazione Originalmente inviato da gve
    Comunque ho notato poi che forse il codice potrebbe dare problemi se l'array è composto da solo 1 o 2 elementi (non ne sono sicuro, ma potrebbe). Quindi forse in definitiva è meglio il codice di bodo (o bisognerebbe provare ...).
    Ho guardato il manuale PHP e devo ammettere che la funzione each la conoscevo poco. In effetti è una funzione abbastanza interessante :o
    Anche sul manuale, comunque, la include in un ciclo while, decantando le lodi della funzione medesima per il suo particolare comportamento con i valori "nulli" nell'array, fatto che rende il suo utilizzo praticamente inattaccabile da errori imprevisti. La funzione each() è simile alla funzione next(), con la differenza però che:
    1) next() sposta il puntatore POI legge il valore
    2) each() legge il valore POI sposta il puntatore. Fra l'altro è proprio per questo che il while nell'esempio funziona, perchè each() oltre a leggere l'array, provvede anche a spostare il puntatore ad ogni lettura, solo dopo aver letto il valore però.
    Va quindi da sè che se faccio un reset e richiamo la funzione next() mi perdo completamente il primo elemento dell'array (proprio perchè prima sposta poi legge), mentre con each li includo tutti, compreso il primo (perchè, appunto, prima legge e poi sposta) :o
    Dopo la lettura dell'ultimo elemento dell'array, il puntatore viene spostato "nel nulla", quindi la funzione richiamata al ciclo successivo restituisce un falso, e il ciclo si conclude.

    [code:1:a521326593]reset ($test_array);
    while ($temp_array = each($test_array)){
    $chiave = $temp_array['key'];
    $valore = $temp_array['value'];
    if ($chiave !== 'chiave_da_escludere') print( "Chiave :" . $chiave . ", valore: " . $valore);
    }[/code:1:a521326593]

  14. #14
    L'avatar di gve
    gve
    gve non è connesso Utente storico
    Data registrazione
    26-01-2003
    Residenza
    Brescia
    Messaggi
    2,964

    Predefinito

    Ottimo bodo, in effetti each non la conoscevo bene neanche io, può essere comoda, e i tuo utimo codice probabilmente è il migliore possibile per una roba del genere; o quasi: sai come si potrebbe forse fare ancora meglio? Dai un'occiata sul manuale php alla struttura di controllo foreach() , è un metodo apposito per ciclare su un array. Praticamente ti permette di sintetizzare il tuo codice di cui sopra in:
    [code:1:e31a053edd]reset ($test_array);
    foreach ($test_array as $chiave => $valore){
    if ($chiave !== 'chiave_da_escludere') print( "Chiave :" . $chiave . ", valore: " . $valore);
    }[/code:1:e31a053edd]
    Elegante, no?
    | Regolamento del Forum | Regolamento di AlterVista | FAQ di AlterVista | Netiquette |

    GVE = GVE Virtual Extension
    AVCM #: 6637

  15. #15
    Guest

    Predefinito

    in effetti il costrutto foreach lo uso spesso nelle mie pagine, avevo guardato come utilizzarlo per array multidimensionali ma non sapevo che si potessero pure estrarre le chiavi oltre che i valori. Sicuramente è il metodo più elegante e compatto per estrarre tutti i valori/chiavi da un array, e in questo caso li estraggo tutti POI faccio la verifica su quali stampo e quali no.
    Se si volesse usare gli array "a mo' di database" occorrerebbe invece (credo) studiare un modo più efficiente per selezionare i record "a monte" in base al confronto del valore/chiave con criteri di ricerca :o

  16. #16
    L'avatar di gve
    gve
    gve non è connesso Utente storico
    Data registrazione
    26-01-2003
    Residenza
    Brescia
    Messaggi
    2,964

    Predefinito

    Non so, quello non lo ho mai fatto in effetti, e non credo sia così semplice trovare qualcosa di così elegante.
    | Regolamento del Forum | Regolamento di AlterVista | FAQ di AlterVista | Netiquette |

    GVE = GVE Virtual Extension
    AVCM #: 6637

  17. #17
    Guest

    Predefinito

    Credo che una buona soluzione per estrarre solo i dati che servono (modello-daisy-cutter :p ) e quindi strutturare appunto gli array "a mo' di database" sia rinunciare a chiavi generate "a caso" durante la generazione dell'array, ma specificare chiavi precise, in modo che quando cerchiamo un elemento nell'array sappiamo già dove trovarlo. Ma questa è un'altra storia :o

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •