Почему определенные значения не отображаются с помощью цикла PHP foreach?

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

  •  07-07-2019
  •  | 
  •  

Вопрос

Я работаю над веб-сайтом, используя сценарий PHP для отображения информации, отформатированной определенным образом из базы данных MySQL.Я хочу, чтобы значения даты из базы данных (в формате ГГГГ-ММ-ДД) отображались как месяц ГГГГ.Возможно, недостаточно эффективный код, который я использую для отображения месяцев в виде слов, приведен ниже:

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;
}

Этот код отображает месяц и год для первой части.Это отлично отображается на веб-странице, если только месяц не август или сентябрь.Если месяц — август или сентябрь, для этой части ничего не печатается, поэтому вместо «Август 2005») вы получите «2005».

Операторы elseif в августе и сентябре форматируются (насколько я могу судить) точно так же, как и другие, поэтому я понятия не имею, почему эти значения не печатаются.Если я просто попрошу его напечатать значение $what, он напечатает либо 08, либо 09, и значения в базе данных будут выглядеть правильно.Я очень надеюсь, что есть что-то простое, что я упускаю из виду, и на что кто-то быстро укажет, потому что я уже довольно долгое время бился головой об стену из-за этой проблемы.

(Я не уверен, имеет ли это какое-либо значение, но я использую плагин Jumi в Joomla, который позволяет пользователям добавлять собственный код на страницу Joomla для разработки этого раздела веб-сайта.)

РЕДАКТИРОВАТЬ:Я только что удалил 0 из 08 и 09, и теперь все они отображаются правильно.Так что я думаю теперь вопрос: почему это решило проблему, когда в проверяемой переменной значения 08 и 09?

Кроме того, извините, что решили проблему так скоро после публикации вопроса.

Это было полезно?

Решение

да, вы должны стереть ведущий 0 в вашем условии, иначе php будет интерпретировать его как восьмеричное, вы кодируете лучше

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;
}

Другие советы

Вы используете Joomla! 1,5, верно? Почему бы не позволить Joomla! сделать эту работу:

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));

В качестве дополнительного преимущества он даже переведет месяц на правильный / используемый язык, если вы когда-нибудь захотите перевести свой веб-сайт.

Пусть MySQL отформатирует дату с помощью Формат даты и верните его в PHP так, как вы хотите.Таким образом, вам не нужно делать никаких манипуляций с PHP.

Вот пример запроса, который вы можете сделать в MySQL:

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

Где:

  • date_column — исходный столбец таблицы, в котором хранится дата, которую вы хотите отформатировать,
  • %M означает, что вы хотите, чтобы название месяца было указано полностью («Январь», «Февраль», «Март» и т. д.), и
  • %Y означает, что вам нужен 4-значный год.

Поле в date_column со значением «2009-09-17» вернет значение «Сентябрь 2009 г.».

Например, следующий вывод отображает исходный date_column ценности наряду с 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     |
+-------------+----------------+

Числа в php, начинающиеся с 0, считаются восьмеричными. Это может быть причиной, почему. Положите " " вокруг них.

Но, пожалуйста, прочитайте ссылку в комментарии к вашему вопросу. Это считается анти-паттерном.

Этот способ гарантирует, что он работает для всех локалей и использует вещи, которые были написаны для вас очень-очень давно.

MySQL:

select UNIX_TIMESTAMP(time) as unixtime from table;

php:

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

Это также позволяет вам повторно использовать переменную $row['unixtime'], чтобы вы могли форматировать ее по-разному или повторно использовать без повторного вызова mysql в том же сценарии.Вы даже можете указать для функции даты другую строку, отличную от константы или некоторых настраиваемых пользователем параметров.

PHP имеет несколько функций (а с версии PHP 5.3 DateTime введите), чтобы иметь дело со временем и датами.

Например, в PHP 5.x:

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

(strftime включен, потому что он обычно переносится на все языки программирования)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top