Почему некоторые значения не отображаются с помощью цикла foreach PHP? - PullRequest
0 голосов
/ 16 сентября 2009

Я работаю над сайтом, использующим 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 отформатированы (насколько я могу судить) точно так же, как и другие, поэтому я понятия не имею, почему эти значения не печатаются. Если я просто прошу его напечатать значение «$», оно будет напечатано как 08 или 09, и значения будут выглядеть правильно в базе данных. Я действительно надеюсь, что есть кое-что простое, я пропускаю, что кто-то быстро укажет, потому что я довольно долго бился головой об стену с этой проблемой.

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

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

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

Ответы [ 6 ]

3 голосов
/ 17 сентября 2009

Вы используете 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));

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

2 голосов
/ 17 сентября 2009

Позвольте MySQL отформатировать дату с помощью date_format и вернуть ее в 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     |
+-------------+----------------+
1 голос
/ 17 сентября 2009

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

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

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

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

1 голос
/ 17 сентября 2009

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

MySQL:

select UNIX_TIMESTAMP(time) as unixtime from table;

PHP:

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

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

1 голос
/ 16 сентября 2009

да, вы должны стереть ведущий 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;
}
1 голос
/ 16 сентября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...