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?
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?
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
mmmmmm...oddio
io sono un neofita...è da una settimana che sto smanettando sul php....
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 :)
<?
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....
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
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.
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)).Originalmente inviato da pukas
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
Ottimo metodo, signore :o
(SPAM!)
for($i=0;$i<(count($_POST)-1);$i++) {
mi da errore in questa linea
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?
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).Originalmente inviato da pukas
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
Cioè? se intendi una riga basta che aggiungi un "\n", cioè dove c'èOriginalmente inviato da pukas
$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
Ho guardato il manuale PHP e devo ammettere che la funzione each la conoscevo poco. In effetti è una funzione abbastanza interessante :oOriginalmente inviato da gve
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]
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
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
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
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