За последние 24 часа нас посетили 18043 программиста и 1599 роботов. Сейчас ищут 886 программистов ...

Архив новостей по месяцам

Тема в разделе "PHP и базы данных", создана пользователем lucky64rus, 28 апр 2012.

  1. lucky64rus

    lucky64rus Активный пользователь

    С нами с:
    16 апр 2012
    Сообщения:
    8
    Симпатии:
    0
    Что имеем: таблицу article со статьями и датами в формате 0000-00-00
    Задача: сделать архив по месяцам вида:
    2012 01 02 03 04 05 06 07 08 09 10 11 12
    2011 01 02 03 04 05 06 07 08 09 10 11 12
    2010 01 02 03 04 05 06 07 08 09 10 11 12
    где месяцы, в которых были статьи, будут отображаться ссылками, а в которых нет статей - не ссылками
    Что я делаю: формирую массив из всех дат, разбиваю его по годам, разбиваю его по месяцам, удаляю дубликаты, запускаю цикл в котором вывожу все цифры от 1 до 12, а при совпадении с месяцами из массива заменяю их ссылками
    Проблема: цикл прерывается на последнем значении из массива, а оно может отличаться от 12, т.е если в году были статьи только в 7 месяце то цикл выводит
    2012 01 02 03 04 05 06 07
    Привожу код:
    Код (PHP):
    1. <table>
    2. <?
    3. $result = mysql_query("SELECT date FROM article ORDER BY date DESC",$db);
    4. $row = mysql_fetch_array ($result); // создаем массив из дат
    5. $year_void = '';// создаем две пустые переменные для сортировки
    6. $month_void = '';
    7. do {
    8. $date = $row['date'];
    9. $date = date_create($date);
    10. $year = date_format($date, 'Y'); // выделяем год из даты
    11. $month = date_format($date, 'm'); // выделяем месяц из даты
    12. if ($year_void != $year) { // сортируем по годам
    13. $year_void = $year;
    14. $months = '12';// создаем переменную для цикла for с количеством месяцев в году
    15. echo "<tr><td align=\"left\"><strong>$year</strong></td>"; // выводим год
    16. }
    17. if ($month_void != $month) { // сортируем по месяцам
    18.         $month_void = $month;
    19.         for ($empty_month=$months;$empty_month>0;$empty_month--){ // цикл выводит все цифры от 1 до 12
    20.             if ($month != $empty_month){ // если переменная не равна значению из цикла
    21.             $months--;
    22.             echo "<td align=\"left\">";
    23.             echo str_pad($empty_month, 2, '0', STR_PAD_LEFT);// выводим пустой месяц
    24.             echo "</td>";
    25.             } else { // если переменные совпадают
    26.                 $months--;
    27.                 echo "<td align=\"left\">";
    28.                 echo"<strong><a href=\"\">$month</a></strong><br/>"; // выводим месяц со ссылкой
    29.                 echo "</td>";
    30.                 break;
    31.                 }
    32.             }
    33.         }
    34. }
    35. while ($row = mysql_fetch_array ($result));
    36. ?>
    37. </table>
    Если я уберу breack; то получаю следующее
    2012 01 02 03 04 05 06 07 08 09 10 11 12
    Отвечать можно без слов, но с кодом )))
    Помогите, а?
     
  2. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Я бы так сделал, не напрягаясь:
    Код (PHP):
    1. <?php
    2. $result=mysql_query("SELECT `date` FROM `article` ORDER BY `date` DESC",$db);
    3. $existsArr=array();
    4. while($row=mysql_fetch_array($result)){
    5.     $date=$row['date'];
    6.     $date=date_create($date);
    7.     $year=date_format($date,'Y'); // выделяем год из даты
    8.     $month=date_format($date,'m'); // выделяем месяц из даты
    9.     if(!isset($existsArr[$year])){
    10.         $existsArr[$year]=array();
    11.     }
    12.     $existsArr[$year][$month]=$month;
    13. }
    14.  
    15. $out='';
    16.  
    17. foreach($existsArr as $key=>$yearRow){
    18.     $out.='<div>'.$key.': ';
    19.  
    20.     for($i=1;$i<=12;$i++){
    21.         $searchStr=($i<10)?'0'.$i:$i;
    22.         if(in_array($searchStr,$yearRow)){
    23.             $out.='[url="#"]'.$searchStr.'[/url] ';
    24.         }else{
    25.             $out.=$searchStr.' ';
    26.         }
    27.     }
    28.     $out.='</div>'."\n";
    29. }
    30. echo $out; 
    К табличному виду, надеюсь, сами приведёте.

    Конструкции типа do{}while() не способствуют логичной организации кода, их лучше использовать там, где в цикле не нужно делать проверок, других циклов и проч., просто для быстрого вывода чего-либо с простым условием. А лучше вообще забыть про эту конструкцию.
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    вы уверены, что дата у вас в строковом формате? в общем это задача для SQL:
    Код (Text):
    1. SELECT substr(`datefield`, 1, 7) AS `month`, count(*)
    2. FROM `articles`
    3. GROUP BY 1
    4. ORDER BY 1 DESC