Что имеем: таблицу 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): <table> <? $result = mysql_query("SELECT date FROM article ORDER BY date DESC",$db); $row = mysql_fetch_array ($result); // создаем массив из дат $year_void = '';// создаем две пустые переменные для сортировки $month_void = ''; do { $date = $row['date']; $date = date_create($date); $year = date_format($date, 'Y'); // выделяем год из даты $month = date_format($date, 'm'); // выделяем месяц из даты if ($year_void != $year) { // сортируем по годам $year_void = $year; $months = '12';// создаем переменную для цикла for с количеством месяцев в году echo "<tr><td align=\"left\"><strong>$year</strong></td>"; // выводим год } if ($month_void != $month) { // сортируем по месяцам $month_void = $month; for ($empty_month=$months;$empty_month>0;$empty_month--){ // цикл выводит все цифры от 1 до 12 if ($month != $empty_month){ // если переменная не равна значению из цикла $months--; echo "<td align=\"left\">"; echo str_pad($empty_month, 2, '0', STR_PAD_LEFT);// выводим пустой месяц echo "</td>"; } else { // если переменные совпадают $months--; echo "<td align=\"left\">"; echo"<strong><a href=\"\">$month</a></strong><br/>"; // выводим месяц со ссылкой echo "</td>"; break; } } } } while ($row = mysql_fetch_array ($result)); ?> </table> Если я уберу breack; то получаю следующее 2012 01 02 03 04 05 06 07 08 09 10 11 12 Отвечать можно без слов, но с кодом ))) Помогите, а?
Я бы так сделал, не напрягаясь: Код (PHP): <?php $result=mysql_query("SELECT `date` FROM `article` ORDER BY `date` DESC",$db); $existsArr=array(); while($row=mysql_fetch_array($result)){ $date=$row['date']; $date=date_create($date); $year=date_format($date,'Y'); // выделяем год из даты $month=date_format($date,'m'); // выделяем месяц из даты if(!isset($existsArr[$year])){ $existsArr[$year]=array(); } $existsArr[$year][$month]=$month; } $out=''; foreach($existsArr as $key=>$yearRow){ $out.='<div>'.$key.': '; for($i=1;$i<=12;$i++){ $searchStr=($i<10)?'0'.$i:$i; if(in_array($searchStr,$yearRow)){ $out.='[url="#"]'.$searchStr.'[/url] '; }else{ $out.=$searchStr.' '; } } $out.='</div>'."\n"; } echo $out; К табличному виду, надеюсь, сами приведёте. Конструкции типа do{}while() не способствуют логичной организации кода, их лучше использовать там, где в цикле не нужно делать проверок, других циклов и проч., просто для быстрого вывода чего-либо с простым условием. А лучше вообще забыть про эту конструкцию.
вы уверены, что дата у вас в строковом формате? в общем это задача для SQL: Код (Text): SELECT substr(`datefield`, 1, 7) AS `month`, count(*) FROM `articles` GROUP BY 1 ORDER BY 1 DESC