2009-09-14 11 views
1

Je dois écrire du code PHP qui n'effectue une action que sur des semaines alternées, en fonction du jour de la semaine (lundi, mardi, etc.) plutôt que du nombre (1er, 7ème etc).PHP, logique des semaines alternées

Ainsi, sur un cycle commençant un lundi, il devrait durer une semaine et non la semaine suivante.

Je suis sûr que cela doit être plus facile que je ne le pense, mais je n'arrive pas à m'en sortir, alors aidez s'il vous plaît!

+0

Qu'avez-vous à ce jour? –

Répondre

7

Vous pouvez simplement prendre le numéro de la semaine, et effectuer votre action quand il est étrange, si le jour est lundi, par exemple (ou même!):

$time=time(); 
$dayNo=strftime('%u', $time); #1=monday 
$weekNo=strftime('%U', $time); #week number 

if (($dayNo==1) && ($weekNo%2)) 
{ 
    #do something on mondays, alternating weeks 
} 
+2

Puis-je commenter que les comparaisons de bits sont souvent beaucoup plus rapides que la division, même si vous utilisez l'opérateur de division de module. Pour les puissances de deux comparaisons utiliser et chaque fois. – scragar

+1

+1 - Vous devrez déterminer si le numéro de la première occurrence est pair ou impair en premier, et ajuster en conséquence, mais cela devrait être très simple (essayez d'ajouter les numéros de la semaine de la première occurrence avec le numéro de la semaine en cours ensemble avant de faire '% 2'). –

+3

Vous attendez que l'opération de module devienne un goulot d'étranglement avant de vous en inquiéter! L'utilisation du module communique mieux l'intention, et la rend aussi facile à exécuter toutes les 3, 4, 5 ou 5 semaines ... –

0

Quelque chose à garder à l'esprit est que la strtotime() fonction est très robuste et peut vous donner des informations floues comme the second Sunday in March ("Second Sunday March 0").

Par exemple, pour trouver le dimanche qui marque la deuxième semaine de ce mois-ci:

<?php 
$month = time(); 

// Calculate the first day of the month contained in the $month timestamp 
$first_day = strtotime(
    date(
     'Y-m-1 00:00:00', 
     $month 
    ) 
); 

// Calculate the sunday opening the week that contains the first day 
// of the month (e.g. August 30th, 2009 is the Sunday that corresponds 
// to September 1st, 2009) 
$pseudo_first_sunday = strtotime(
    'First Sunday', 
    strtotime(
     '-1 Week', 
     $first_day 
    ) 
); 

var_dump(date('Y-m-d', strtotime('Second Week', $pseudo_first_sunday))); 

La sortie de ce script sera (en 2009-9-14):

string(10) "2009-09-06" 

Qui est la deuxième semaine de Septembre (mais pas la deuxième semaine complète, si vous voulez que remplacer $first_day pour $pseudo_first_sunday).

Juste quelque chose à garder à l'esprit lorsque vous jouez avec des dates en PHP.

1

Alors que Paul Dixon cloués, si vous êtes après une seule ligne, vous pouvez simplement faire ...

if(date('W') % 2) { 
// Will only execute on alternate weeks. 

}