2012-05-31 12 views
4

J'ai besoin de la liste des six mois précédents et j'utilise le code suivant pour cela.Liste des six derniers mois en PHP

for ($i=6; $i >= 1; $i--) { 
    array_push($months, date('M', strtotime('-'.$i.' Month'))); 
} 

print_r($months); 

Sa donne la mauvaise sortie comme suit

Array 
(
    [0] => 'Dec' 
    [1] => 'Dec' 
    [2] => 'Jan' 
    [3] => 'Mar' 
    [4] => 'Mar' 
    [5] => 'May' 
) 

Il doit être

Array 
(
    [0] => 'Nov' 
    [1] => 'Dec' 
    [2] => 'Jan' 
    [3] => 'Feb' 
    [4] => 'Mar' 
    [5] => 'Apr' 
) 

Où suis-je tort. Help please

+1

Le problème est que 'month' n'est pas défini comme vous le pensez. C'est le 31 et tout. Donc le 31 du 5ème mois moins 1 mois est le 31 du 4ème mois. Ce qui est évidemment le premier du dernier mois. – Nanne

+0

@Nanne vous devriez probablement mettre cela comme une réponse, une grande explication :) –

+0

@siganteng merci, mais je n'ai pas eu le temps de tester de manière efficace quelque chose d'utile comme une solution, donc ce n'est que la moitié de smk3108 besoins :) – Nanne

Répondre

10

Vous devez commencer le calcul à partir du premier jour du mois.

$first = strtotime('first day this month'); 
$months = array(); 

for ($i = 6; $i >= 1; $i--) { 
    array_push($months, date('M', strtotime("-$i month", $first))); 
} 

print_r($months); 

/* 
Array 
(
    [0] => Nov 
    [1] => Dec 
    [2] => Jan 
    [3] => Feb 
    [4] => Mar 
    [5] => Apr 
) 

*/ 
+0

la sortie est pas comme OP voulait. – k102

+0

@ k102 J'ai corrigé le code. Merci. – flowfree

+0

$ first = strtotime ('premier jour du mois précédent'); $ mois = array(); pour ($ i = 6; $ i <= 1; $ i--) { array_push ($ mois, date ('M', strtotime ("- $ i mois", $ premier))); } fonctionne bien avec un changement. – smk3108

0

utilisation celle-ci:

date('M',strtotime('-'.$i.' Month', strtotime(date('Y-m-01')))) 

pourquoi: car aujourd'hui est le 31 mai et non le mois evry a 31 jours. actuellement cette fonction (je veux dire +/- mois) n'est pas si fiable. pouvez-vous deviner quel est le résultat de celui-ci:

print(date('Y-M-d',strtotime('+1 Month', strtotime(date('2012-01-30'))))."\n"); 

?

3

Et comme toujours je posterai le chemin d'objet de faire ceci:

$startDate = new DateTime('first day of this month - 6 months'); 
$endDate = new DateTime('last month'); 
$interval = new DateInterval('P1M'); // P1M => 1 month per iteration 

$datePeriod = new DatePeriod($startDate, $interval, $endDate); 

foreach($datePeriod as $dt) { 
    array_push($months, $dt->format('M')); 
} 

/* output: 
Array 
(
    [0] => Nov 
    [1] => Dec 
    [2] => Jan 
    [3] => Feb 
    [4] => Mar 
    [5] => Apr 
) 
*/ 

Voir DateTime, DateInterval et DatePeriod pour plus d'informations.

Questions connexes