Подсчитайте архив пост-статей по годам и месяцам

#php #mysql

#php #mysql

Вопрос:

мне нужно перечислить общий архив статей по годам и месяцам следующим образом :

Вывод (мне нужно):

 2014
   January(31)
   February(28)
   March(0)
   April(130)
   May(450)
   June(0)
   July(0)
   August(0)
   September(0)
   October(520)
   November(20)
   December(31)
  

PHP:

 $sql = "SELECT title, YEAR(FROM_UNIXTIME(timestamp)) AS YEAR, 
                MONTHNAME(FROM_UNIXTIME(timestamp)) AS MONTH, 
                COUNT(*) AS TOTAL 
         FROM article GROUP BY YEAR, MONTH ORDER BY YEAR DESC, MONTH ";

$newsdata = DB->fetch($sql);

$currentYear = null;

foreach($newsdata AS $news){            
  if ($currentYear != $news['YEAR']){
     echo '<ul>'.$news['YEAR'].'</ul>';
  $currentYear = $news['YEAR'];
  } 
     echo '<li>'.$news['MONTH'].' '.$news['TOTAL'].'</li>';
  }
  

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

Вывод:

 2014
       January(31)
       February(28)
       April(130)
       May(450)
       October(520)
       November(20)
       December(31)
  

Мне нужно перечислить весь месяц и распечатать общую статью за каждый месяц. если месяц не опубликовал статью, распечатайте (0) за этот месяц.

как я могу решить свою проблему? мой код / способ верен ?!

Комментарии:

1. Просто есть массив месяцев

2. @Strawberry: что ты имеешь в виду?

3. Смотрите Ответ Джоша ниже

Ответ №1:

Ваш запрос к базе данных не вернет строку за месяц, в которой нет статей. Он ничего не знает о месяцах. Поэтому вам нужно обработать это в коде, имея массив всех месяцев и просматривая его. Альтернативой было бы изменить вашу схему, создать другую таблицу со всеми 12 месяцами и присоединиться к ней. Но я думаю, что вам проще сделать следующее:

 $months = array( "January", "February", ...  );
  

Затем вы можете сделать следующее в своем выводе вместо этого:

 // Index article counts by month and year for easy lookup
$indexedNewsData = array();
foreach ($newsdata as $news) {
  $indexedNewsData[$news['YEAR']][$news['MONTH']] = $news['TOTAL'];
}

// Then print output
foreach($newsdata AS $news){            
  if ($currentYear != $news['YEAR']){
    echo '<ul>'.$news['YEAR'].'</ul>';
    $currentYear = $news['YEAR'];
  } else {
    // Continue here otherwise we will print each year's data 12x
    continue;
  }
  foreach ($months as $month) {
    $total = intval($indexedNewsData[$news['YEAR']][$month]);        
    echo '<li>'.$month.' '.$total.'</li>';
  }     
}
  

Комментарии:

1.Я вижу эту ошибку для каждого месяца: Notice: Undefined index: February in Notice: Undefined index: January in …..

2. Вы уверены, что сначала установили массив $months?