Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как вывести даты, сгруппировав их по месяцам?
 
 автор: *m*   (08.02.2011 в 16:22)   письмо автору
 
 

Привет.

есть массив дат.
например:


Array
(
    [0] => 15.01.2011
    [1] => 25.01.2011
    [2] => 26.01.2011
    [3] => 19.02.2011
    [4] => 24.02.2011
    [5] => 26.02.2011
)


эти даты нужно выводить в таком виде:

  15.01.,25.01., 26.01.2011
  19.02.,24.02., 26.02.2011


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

  Ответить  
 
 автор: cheops   (08.02.2011 в 16:25)   письмо автору
 
   для: *m*   (08.02.2011 в 16:22)
 

А массив всегда сортирован от меньших к большим датам?

  Ответить  
 
 автор: sim5   (08.02.2011 в 16:26)   письмо автору
 
   для: *m*   (08.02.2011 в 16:22)
 

Надо было даты представлять как ГГГГ.ММ.ДД, и проблем лишних бы не было, ведь представить их при выводе так как вы показываете, труда бы тоже не составило. От куда они у вас, даты эти?

  Ответить  
 
 автор: *m*   (08.02.2011 в 16:34)   письмо автору
 
   для: sim5   (08.02.2011 в 16:26)
 

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

 15.01.,25.01., 26.01.2011
  19.02.,24.02., 26.02.2011

  Ответить  
 
 автор: sim5   (08.02.2011 в 16:37)   письмо автору
 
   для: *m*   (08.02.2011 в 16:34)
 

Ну тогда какие проблемы:
Устанавливаете переменную вне цикла.
В цикле проверяете - если она пуста или не равна месяцу даты текущей итерации, то помещаем месяц этой даты в переменную и выводим перевод строки.
Вывод даты.

Кстати, это прямо при разложении ресурса можно делать, не вынося ради этого даты в массив.

  Ответить  
 
 автор: *m*   (08.02.2011 в 16:52)   письмо автору
 
   для: sim5   (08.02.2011 в 16:37)
 

плиз дайте пример, я уже голову сломал, никак не соображу.

  Ответить  
 
 автор: sim5   (08.02.2011 в 17:06)   письмо автору
 
   для: *m*   (08.02.2011 в 16:52)
 

:))
Когда-то тут была тема "Алфавитный рубрикатор", я там все подробно рассказывал. А вам ведь тоже самое надо, и все просто до смешного. Отвлекитесь пока от дат, рассмотрите простой пример - вам надо вывести:

1 1 1 1 1
2 2 2 2 2
и т.д.

И так, если вам надо знать, пора ли переходить на новую строку, что вы будете делать? Конечно же проверять, а равно ли выводимое число числу, которое уже находится в строке. Так ведь?
Вот оно и решение:
<?
$num 
0;
for(...) {
  if(!
$num || $num != $n) {
    
$num $n;
    echo 
"<br>" 
  
}
  echo 
$n
}
где $n - текущее число из массива выводимого. То же самое и с датой, только проверять нужно месяц в ней, а для этого есть готовые функции. Вот и все. Проверьте с единичками и двойками, убедитесь сами.

  Ответить  
 
 автор: cheops   (08.02.2011 в 16:37)   письмо автору
 
   для: *m*   (08.02.2011 в 16:34)
 

Можно поступить следующим образом
<?php 
  $dates 
= array  
  (  
    
=> "15.01.2011"
    
=> "25.01.2011",  
    
=> "26.01.2011",  
    
=> "19.02.2011",  
    
=> "24.02.2011",  
    
=> "26.02.2011"  
  
); 
  
$result = array(); 
  
$mth ""
  
$end ""
  for(
$i 0$i count($dates); $i++) 
  { 
    list(
$day$month$year) = explode("."$dates[$i]); 
    if(
$mth != "$month.$year"
    { 
      if(!empty(
$mth)) $result[$mth] .= $end
      
$mth "$month.$year"
      
$end "$day.$month.$year"
    } 
    else 
    { 
      
$result[$mth] .= "$day.$month, "
    } 
  } 
  
$result[$mth] .= $end
  echo 
"<pre>"
  
print_r($result); 
  echo 
"</pre>"
?>

PS Но вообще на уровне базы данных этот вопрос решить проще и дешевле в плане производительности.

  Ответить  
 
 автор: *m*   (08.02.2011 в 16:57)   письмо автору
 
   для: cheops   (08.02.2011 в 16:37)
 

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

  Ответить  
 
 автор: cheops   (08.02.2011 в 16:59)   письмо автору
 
   для: *m*   (08.02.2011 в 16:57)
 

Это уже не сложно
<?php
  
foreach($result as $key => $value) echo "$value<br />";
?>

  Ответить  
 
 автор: *m*   (08.02.2011 в 17:03)   письмо автору
 
   для: cheops   (08.02.2011 в 16:59)
 

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

  Ответить  
 
 автор: cheops   (08.02.2011 в 17:09)   письмо автору
 
   для: *m*   (08.02.2011 в 17:03)
 

>то есть можно как то и такой вывод организовать сразу после выборки..
Это нужно ваш дамп вашей таблицы смотреть, желательно в новой теме и в разделе MySQL :)))

  Ответить  
 
 автор: *m*   (10.02.2011 в 13:23)   письмо автору
 
   для: cheops   (08.02.2011 в 17:09)
 

разобрался спасибо)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования