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?
Printable View
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)).Citazione:
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.
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).Citazione:
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 ...).
Cioè? se intendi una riga basta che aggiungi un "\n", cioè dove c'èCitazione:
Originalmente inviato da pukas
$Message .= "$key = $val\n";
metti
$Message .= "$key = $val\n\n";
Ho guardato il manuale PHP e devo ammettere che la funzione each la conoscevo poco. In effetti è una funzione abbastanza interessante :oCitazione:
Originalmente 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?
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.
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