[PHP] Problema ciclo for

valvasori

Nuovo Utente
13 Ott 2016
13
1
3
59
Ciao a tutti.
Ho il seguente problema: devo inserire in un calendario una serie precisa di appuntamenti (facciamo 10 come esempio), ma vorrei che NON inserisse questi appuntamenti la domenica o nei giorni di festa o durante il periodo natalizio.
Ho fatto una prova facendo "saltare" al ciclo la domenica ed effettivamente non mi inserisce l'appuntamento, ma mi inserisce solo 9 appuntamenti invece di 10.
Questo lo script:

PHP:
for ($day = 0; $day < $num_ripetizione; $day++) // Inserisco le ore sul Planning
{
     $datalezione = date('Y-m-d', mktime(12,0,0,$mm, $gg, $aa) + $day * (86400*$ripetizione));
     $n_giorno = date('w',strtotime($datalezione));
     if($n_giorno != 0)
     {
           //Inserisce l'appuntamento nel calendario
     }
}
dove $num_ripetizione è il numero di ripetizioni e $ripetizione è la tipologia di ripetizione (giornaliera, settimanale ecc.).

Qualcuno può aiutarmi?
Grazie
 
Ultima modifica di un moderatore:
Ciao, utilizza un ciclo while
PHP:
$i = 0;
while ($i < 10) {
    echo $i . "<br/>";
    $i++;
}
incrementi il contatore solo se fai l'inseriemento
 
@criric, purtroppo mi inserisce sempre 9 istanze anche col ciclo while.
Ho provato a modificare lo script in questo modo:

for ($day = 0; $day < $num_ripetizione; $day++) // Inserisco le ore sul Planning
{
$datalezione = date('Y-m-d', mktime(12,0,0,$mm, $gg, $aa) + $day * (86400*$ripetizione));
$n_giorno = date('w',strtotime($datalezione));
if($n_giorno == 0)
{
// Non fare niente
}
else
{
//Inserisce l'appuntamento nel calendario
}
}

ma non cambia niente, me ne inserisce sempre e solo 9.
 
ciao
non vorrei dire una bestialità, ma mi sembra che l'errore sia qui 86400*$ripetizione
da dove satla fuori quella variabile $ripetizione?
per caso hai sbagliato a scrivere $ripetizione al posto di $num_ripetizione?
 
@borgo italia, non è un errore. Come ho scritto nel post iniziale $ripetizione è la tipologia di ripetizione (giornaliera, settimanale ecc.).

L'inserimento nel DB avviene regolarmente sia secondo il numero di ripetizioni ($num_ripetizione) sia rispetto alla cadenza delle ripetizioni ($ripetizione).

Quello che non riesco a "imporgli" è di saltare l'inserimento se il giorno è di domenica (e poi vorrei farlo su tutti i giorni festivi), ma mantenendo il valore della $num_ripetizione invariato.

In questo momento, invece, non mi inserisce la data della domenica, ma mi scala il valore di $num_ripetizione e quindi alla fine mi ritrovo con un numero inferiore di record.
 
ciao
prima mi ero dimenticato come era lo script che avevamo già visto
penso di aver trovato l'errore (var_dump questo sconosciuto)
prova il seguente
PHP:
<?php
$num_ripetizione=5;
$aa=2016;
$mm=11;
$gg=20;//il 20 novembre è domenica
$ripetizione=3;
for ($day = 0; $day < $num_ripetizione; $day++){
    $datalezione = mktime(12,0,0,$mm, $gg, $aa) + $day*86400*$ripetizione;
    $n_giorno = date('w',$datalezione);
    $n=$day+1;//solo per conteggio e visualizzazione
    var_dump($n_giorno);
    if($n_giorno !=0){//non domenica
        echo "$n) inserito giorno ".date('D Y-m-d',$datalezione)."<br>";
    }else{
        echo "$n) NON inserito  giorno ".date('D Y-m-d',$datalezione)."<br>";
    }
}
?>
uotput
string(1) "0" 1) NON inserito giorno Sun 2016-11-20
string(1) "3" 2) inserito giorno Wed 2016-11-23
string(1) "6" 3) inserito giorno Sat 2016-11-26
string(1) "2" 4) inserito giorno Tue 2016-11-29
string(1) "5" 5) inserito giorno Fri 2016-12-02
mi sono accorto che il var_dump mi dava sempre lunedì
l'errore è $n_giorno = date('w',strtotime($datalezione));
correggi in
$n_giorno = date('w',$datalezione);
$data_lezione è gia in formato timestamp
 
Ho corretto $datalezione, ma non funziona lo stesso.
Vedi che anche nel tuo output

string(1) "0" 1) NON inserito giorno Sun 2016-11-20
string(1) "3" 2) inserito giorno Wed 2016-11-23
string(1) "6" 3) inserito giorno Sat 2016-11-26
string(1) "2" 4) inserito giorno Tue 2016-11-29
string(1) "5" 5) inserito giorno Fri 2016-12-02


ti inserisce solo 4 record.

Ho provato anche a dirgli che se $n_giorno == 0 non faccia nulla:

for ($day = 0; $day < $num_ripetizione; $day++)
{
$datalezione = date('Y-m-d', mktime(12,0,0,$mm, $gg, $aa) + $day * (86400*$ripetizione));
$n_giorno = date('w',$datalezione);
if($n_giorno == 0){}
else if($datalezione == date('Y')."-12-08"){}
else
{
//Inserisco nel database
}
}
}
 
a me con il while funziona
PHP:
$num_ripetizione = 5;
$aa = 2016;
$mm = 11;
$gg = 20; //il 20 novembre è domenica
$ripetizione = 3;
$i = $day = 0;
while ($i < $num_ripetizione) {
    $datalezione = mktime(12, 0, 0, $mm, $gg, $aa) + $day * 86400 * $ripetizione;
    $n_giorno = date('w', $datalezione);
    $n = $day + 1; //solo per conteggio e visualizzazione

    if ($n_giorno != 0) {//non domenica
        echo "$n) inserito giorno " . date('D Y-m-d', $datalezione) . "<br>";
        $i++;
    } else {
        echo "$n) NON inserito  giorno " . date('D Y-m-d', $datalezione) . "<br>";
    }
    $day++;
}
non ho capito però il senso di questi inserimenti, se salti un inserimento la ripetizione si raddoppia.
edit
avevo sbagliato ad incollare
 
ciao
per forza inserisce 4 record su 5 uno casca di domenica e, visto che c'è if ($n_giorno != 0){... la domenica non l'inserisce
ho messo a posta la data 20 novembre, se provi un'altra data li inserisce tutti (salvo che qualcuno non cada di domenica)
eventualmente si può fare in modo che se una lezione cade di domenica spostare la data della lezione o al lunedì successivo (se non già esistente) o in coda alle altre

o usi lo script di criric che funzia
 
Ultima modifica:
Allora, con il ciclo while effettivamente funziona, ma facendo una modifica a quanto postato in precedenza da @criric :

PHP:
$num_ripetizione = 10;
$aa = 2016;
$mm = 11;
$gg = 18; //il 18 novembre è venerdì
$ripetizione = 1; //ripetizione giornaliera
$i = $day = 0;
while ($i < $num_ripetizione) {
    $datalezione = mktime(12, 0, 0, $mm, $gg, $aa) + $day * 86400 * $ripetizione;
    $n_giorno = date('w', $datalezione);
    $n = $day + 1; //solo per conteggio e visualizzazione

    if ($n_giorno == 0) {//non domenica
        echo "$n) NON inserito  giorno " . date('D Y-m-d', $datalezione) . "<br>";
    } else {
        echo "$n) inserito giorno " . date('D Y-m-d', $datalezione) . "<br>";
        $i++;
    }$i++;
    $day++;
}

invece di darmi 10 record inseriti e 1 NON inserito, me ne da solo 5 inseriti e 1 NON inserito:

1) inserito giorno Fri 2016-11-18
2) inserito giorno Sat 2016-11-19
3) NON inserito giorno Sun 2016-11-20
4) inserito giorno Mon 2016-11-21
5) inserito giorno Tue 2016-11-22
6) inserito giorno Wed 2016-11-23
 
Ultima modifica di un moderatore:
riguarda il codice, lo avevo modificato un minuto dopo averlo postato. C'è un $i++; di troppo
 
ciao @valvasori
scusa quando scrivi del codice usa gli appositi bccode (quartultima iconcina inserisci->codice ... scrivi -> php)
o prima e deopo PHP//**codice /PHP dove PHP e /PHP racchiusi tra le parentesi[ ]
 
  • Like
Reactions: criric

Discussioni simili