Comment se fait-il que certaines valeurs ne sont pas affichées en utilisant PHP foreach loop?

StackOverflow https://stackoverflow.com/questions/1432980

  •  07-07-2019
  •  | 
  •  

Question

Je travaille sur un site Web utilisant un script PHP pour afficher des informations formatées d'une certaine manière à partir d'une base de données MySQL. Je souhaite que les valeurs de date de la base de données (au format AAAA-MM-JJ) soient affichées sous la forme Mois AAAA. Le code peut-être assez efficace que j'utilise pour afficher les mois sous forme de mots est présenté ci-dessous:

foreach($monthstart as $monthnext)
    {
    preg_match("/[[0-9][0-9]]*/", $monthnext, $startmonthfull);
    }
echo "<b>Duration: </b>";
foreach($startmonthfull as $which)
{
   if($which == 01)
{
echo "January ";
}
elseif($which == 02)
{
echo "February ";
}
elseif($which == 03)
{
echo "March ";
}
elseif($which == 04)
{
echo "April ";
}
elseif($which == 05)
{
  echo "May ";
}
elseif($which == 06)
{
  echo "June ";
}
elseif($which == 07)
{
  echo "July ";
}
elseif($which == 08)
{
  echo "August ";
}
elseif($which == 09)
{
  echo  "September ";
}
elseif($which == 10)
{
  echo "October ";
}
elseif($which == 11)
{
  echo "November ";
}
elseif($which == 12)
{
  echo "December ";
}
}
foreach($year as $printyear)
{
  echo $printyear;
}

Ce code affiche le mois et l’année pour la première partie. Cela s'affiche parfaitement sur la page Web, sauf si le mois est août ou septembre. Si le mois est août ou septembre, rien ne sera imprimé pour cette partie. Ainsi, au lieu de "août 2005", vous obtiendrez "2005".

Les déclarations elseif d’août et de septembre sont formatées (de ce que je peux dire) exactement de la même façon que les autres. Par conséquent, je ne sais pas pourquoi ces valeurs ne sont pas imprimées. Si je lui demande simplement d'imprimer la valeur $ which, elle est imprimée sous la forme 08 ou 09 et les valeurs sont correctes dans la base de données. J'espère vraiment qu'il y a quelque chose de simple, j'oublie que quelqu'un le signalera rapidement parce que je me cogne la tête contre le mur depuis un certain temps avec ce problème.

(Je ne suis pas sûr que cela fasse une différence, mais j'utilise le plug-in Jumi dans Joomla, qui permet aux utilisateurs d'ajouter du code personnalisé dans une page Joomla pour développer cette section du site.)

EDIT: Je viens de retirer les 0 de 08 et 09 et maintenant ils s’affichent correctement. Donc, je suppose que la question est maintenant de savoir pourquoi cela a-t-il corrigé le problème alors que dans la variable vérifiée, les valeurs sont 08 et 09?

Désolés de vous en avoir avisé si peu de temps après avoir posté une question.

Était-ce utile?

La solution

oui vous devez effacer le 0 initial sur votre condition ou php l’interpréterait comme octal, vous coderiez mieux

foreach($monthstart as $monthnext){
    preg_match("/[[0-9][0-9]]*/", $monthnext, $startmonthfull);
}
echo "<b>Duration: </b>";
$monthArray = array(
1 => 'January',
2 => 'February',
3 => 'March',
4 => 'April',
5 => 'May',
6 => 'June',
7 => 'July',
8 => 'August',
9 => 'September',
10 => 'October',
11 => 'November',
12 => 'December');

foreach($startmonthfull as $which){
 echo($monthArray[$which] . " ");
}
foreach($year as $printyear)
{
  echo $printyear;
}

Autres conseils

Vous utilisez Joomla! 1,5, non? Pourquoi ne pas laisser Joomla! faire ce travail:

if (!defined('MY_DATE_FORMAT'))
   define('MY_DATE_FORMAT', '%B %Y');
jimport('joomla.utilities.date');

$mysql_date = '2009-08-01';

$jdate = new JDate($mysql_date);
echo $jdate->toFormat(JText::_(MY_DATE_FORMAT));

Comme avantage supplémentaire, il traduira même le mois dans la langue de droite / utilisée si vous choisissez de traduire votre site Web.

Laissez MySQL formater la date avec date_format et renvoyez-le à PHP comme vous le souhaitez. De cette façon, vous n’avez pas besoin de manipuler PHP.

Voici un exemple de requête que vous adresseriez à MySQL:

select date_format(date_column, '%M %Y') as formatted_date from table;

Où:

  • date_column est la colonne de la table d'origine qui stocke la date que vous souhaitez formater,
  • % M signifie que vous voulez que le nom du mois soit épelé en entier ('Janvier', 'Février', 'Mars', etc.) et
  • % Y signifie que vous voulez l'année à 4 chiffres.

Un champ dans date_column avec la valeur '2009-09-17' retournera comme 'septembre 2009'

Par exemple, la sortie suivante affiche les valeurs d'origine date_colonne avec les valeurs date_format () :

+-------------+----------------+
| date_column | formatted_date |
+-------------+----------------+
| 2009-09-11  | September 2009 |
| 2009-09-02  | September 2009 |
| 2009-09-01  | September 2009 |
| 2009-08-31  | August 2009    |
| 2009-08-04  | August 2009    |
| 2009-08-01  | August 2009    |
| 2009-07-11  | July 2009      |
| 2009-07-01  | July 2009      |
| 2009-06-30  | June 2009      |
| 2009-06-20  | June 2009      |
| 2009-06-09  | June 2009      |
| 2009-05-26  | May 2009       |
| 2009-05-09  | May 2009       |
| 2009-05-08  | May 2009       |
| 2009-04-22  | April 2009     |
| 2009-04-20  | April 2009     |
| 2009-04-19  | April 2009     |
| 2009-03-05  | March 2009     |
| 2009-03-04  | March 2009     |
| 2009-03-03  | March 2009     |
+-------------+----------------+

Les nombres en php commençant par 0 sont considérés comme octaux. Cela pourrait être la raison pour laquelle. Mettez " " autour d'eux.

Mais s'il vous plaît lisez le lien dans le commentaire de votre question. Ceci est considéré comme un anti-modèle.

Ainsi, cela fonctionne pour tous les paramètres régionaux et utilise des éléments écrits pour vous il y a très longtemps.

mysql:

select UNIX_TIMESTAMP(time) as unixtime from table;

php:

$formatted_time = date('F Y', $row['unixtime']);

Cela vous permet également de réutiliser la variable $ row ['unixtime'] afin de la formater de différentes manières ou de la réutiliser sans appeler mysql à nouveau dans le même script. Vous pouvez même fournir une chaîne différente d’une constante ou de certaines options configurables par l’utilisateur à la fonction de date.

PHP a plusieurs fonctions (et depuis PHP 5.3, le DateTime type) pour gérer les heures et les dates.

Par exemple, en PHP 5.x:

$mytime = strtotime($monthstart);
// $output_date = date("F Y", $mytime);
$output_date = strftime("%B %Y", $mytime);

(strftime est inclus car il est généralement portable dans plusieurs langages de programmation)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top