Hey

,
Bon, j'ai pris 20 minutes pour faire ton script, mais sans utiliser strtotime. Déjà parce que ça m'intéressait et pour te montrer une autre façon de procéder.
On travaille sur le nombre de semaine. En effet, chaque semaine a un numéro attribué dans l'année. Par exemple, cette semaine a le numéro 44.
L'idée est de prendre le numéro de semaine du début du mois et de fin de mois. On itère un jour qui démarre de 0 et qui va jusqu'à la fin du mois. Pour chaque itération, on regarde le numéro de semaine à changer ou pas. S'il change, c'est qu'on démarre une nouvelle semaine, donc on temporise le jour, sinon on continue l'itération.
Enfin, une fois nos débuts de semaine temporisé, on affiche les semaines complètes (c'est l'affichage du résultat, il est tout simple).
Je n'ai pas testé les effets de bord,
i.e. si le mois commence un lundi par exemple. L'affichage pourrait peut-être avoir des soucis (je n'y ai pas réfléchit). À toi de tester. Ce n'est qu'une base.
Voici l'algorithme :
<?php
ini_set('date.timezone', 'Europe/Paris');
$now = time();
$df = 1;
$dl = (int) date('t', $now);
$m = (int) date('m', $now);
$y = (int) date('Y', $now);
$wm = (int) date('W', mktime(0, 0, 0, $m, $df, $y));
$wM = (int) date('W', mktime(0, 0, 0, $m, $dl, $y));
$id = 0;
$l = $wm;
$ws = array();
while( $wM >= ($t = (int) date('W', mktime(0, 0, 0, $m, $id, $y)))
&& $id++ < $dl) {
if($t == $l)
continue;
$ws[] = $id - 1;
$l++;
}
$prv = $df;
for($i = 0, $max = count($ws); $i < $max; $i++) {
var_dump($prv . ' -> ' . ($ws[$i] - 1));
$prv = $ws[$i];
}
if($prv != $dl)
var_dump($prv . ' -> ' . $dl);
et ça m'affiche
Code : Tout sélectionner
string(6) "1 -> 5"
string(7) "6 -> 12"
string(8) "13 -> 19"
string(8) "20 -> 26"
string(8) "27 -> 31" QED.
Alors oui, j'ai oublié de préciser pour les variables, j'ai pas mis des noms complets (pour mes tests, j'ai mes règles de nommage courtes

). Donc :
- df : day first soit le premier jour du mois ;
- dl : day last soit le dernier jour du mois ;
- m : month soit le mois ;
- y : year soit l'année ;
- wm : week min soit le numéro de la première semaine du mois ;
- wM : week Max soit le numéro de la dernière semaine du mois ;
- id : i day soit la variable incrémentée sur les jours (pour la boucle) ;
- l : last soit la dernière semaine itérée (pour la boucle) ;
- ws : week start soit le début de chaque semaine (notre résultat de boucle).
Et on dit ceci : tant que la semaine courante (calculée avec notre variable
id) est inférieure à la semaine maximum, et que notre variable
id, soit le jour du mois itéré est inférieur au jour maximum du mois (en gros : on lit toutes les semaines du mois), alors si la semaine calculée
t est égale à la semaine courante étudiée
l, on ne fait rien. Sinon, on a changé de semaine, donc il faut temporiser le jours qui représente le début de semaine.
Et l'affichage est tout simple. On prend notre résultat, et on affiche les intervalles.
Ça peut paraître compliqué comme ça, mais en fait le raisonnement est tout simple. On travaille sur les numéros de semaine et c'est tout. Notre boucle fonctionne même si on est en fin d'année où le numéro de semaine maximum risque de passer à 1 car on fait aussi un test sur les jours (à travers
id). Donc normalement, pas de soucis.
Je te laisse méditer là-dessus

.