Архив новостей на PHP и MYSQL с нулевым результатом - PullRequest
0 голосов
/ 12 марта 2012

Я пытаюсь перечислить все предыдущие месяцы, в которых были сделаны посты, и отобразить количество постов, например,

2011
  November (14)
  October (12)
  April (3)
2010
  December (2)

    etc etc

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

$sql = "SELECT nid, ndate FROM weaponsnews
    ORDER BY ndate DESC";
$result = $db->query($sql);

$data = array();

while($row = $result->fetch_assoc())
{
    $year = date('Y', strtotime($row['ndate']));
    $month = date('m', strtotime($row['ndate']));

    $data[$year][$month][] = $row;
}
$result->free();

foreach($data as $_year => $_months)
{
    echo $_year. "<br>";
    foreach($_months as $_month => $_entries)
    {
        $mentries = count ($_entries);
        echo $_month. " (" .$mentries. ")";

    }
}

1 Ответ

2 голосов
/ 12 марта 2012

Проще подсчитать в запросе MySQL. Например:

SELECT YEAR(`ndate`) AS 'year', MONTH(`ndate`) AS 'month', COUNT(`nid`) AS 'count'  FROM `weaponsnews ` GROUP BY YEAR(`ndate`), MONTH(`ndate`) DESC

Это дает вам три столбца, где первый - год, второй - месяц, а третий - количество элементов в этом месяце. Затем вы можете легко перебрать этот список с помощью foreach. Что-то вроде:

$data = array();
while($row = $result->fetch_assoc()) {
    $data[$row['year']][$row['month']] = $row['count'];
}
$result->free();

Это должно дать вам массив вроде:

$data = array(
    '2001' => array(
        '1' => '83',
        '3' => '102'
    ),
    '2012' => array(
        '6' => '43',
        '9' => '33'
    ),
    '2013' => array(
        '7' => '55'
    )
);

Вы можете распечатать дерево, просматривая массив:

foreach ($data as $year => $months) {
    echo $year.'<br>';
    foreach ($months as $month => $count) {
            echo $month.'('.$count.')<br>';
    }
}
...