0

私はmysqlのタイムスタンプのリストを持っています。最初の LI として年を、ネストされた LI として月を持つ html メニューを作成したいと考えています。例えば:

2012年 -> 12月、5月、4月。2011年 -> 11月、1月。2010 年 -> 4 月、3 月、2 月。

ご覧のとおり、メニューを年の配列にし、データベースにある月 (および年) だけを月内に表示したいと考えています。

確かに簡単ですが、これを実行する方法がわかりません。私はすべてのタイムスタンプを照会してそれらを循環させていますが、配列を埋めなければならないときは管理できません。

4

4 に答える 4

2

このようなことを試しましたか?

<?php
// this would've been pulled from mysql
$data = array(
    array('date' => "2010-11-12 12:34:56", 'some' => 'data'),
    array('date' => "2010-12-12 12:34:56", 'some' => 'data'),
    array('date' => "2010-12-13 12:34:56", 'some' => 'data'),
    array('date' => "2011-01-01 12:34:56", 'some' => 'data'),
);

$grouped = array();

foreach ($data as $row) {
    $year = substr($row['date'], 0, 4);
    $month = substr($row['date'], 6, 2);
    $grouped[$year][$month][] = $row;
}

var_dump($grouped);
于 2012-06-26T12:30:15.077 に答える
2

必要な SQL は、おそらく次のようなものです。

SELECT YEAR(date) AS year, MONTH(date) AS month, COUNT(*) AS entries FROM my_table
GROUP BY year,month ORDER BY year ASC, month ASC;

コードは次のようになります。

$previous_year = null;
foreach ($result_rows as $row) {
    if ($previous_year == null || $row['year'] != $previous_year) {
        if ($previous_year != null) {
            echo '</ul>/li>';
        }
        echo '<li><span class="year">'.$row['year'].'</span><ul>';
        $previous_year = $row['year'];
    }
    echo '<li>'.$row['month'].' ('.$row['entries'].')</li>';
}
if ($previous_year != null) {
    echo '</ul></li>';
}

編集:

別の答えに基づく代替PHP、これはより整頓されています:

$grouped = array();
foreach ($result_rows as $row) {
    $grouped[$row['year']][$row['month']] = $row;
}

foreach ($grouped as $year => $months) {
    echo "<li>$year";
    echo "<ul>";
    foreach ($months as $month => $row) {
        echo "<li>$month (".$row['entries'].")</li>";
    }
    echo "</ul></li>";
}
于 2012-06-26T12:34:27.963 に答える
1

GROUP BYを使用してクエリをグループ化し、適切な構造を作成するPHPのループを使用する必要があります。

于 2012-06-26T12:10:21.870 に答える
1

わずかなpeusdoコードで。

$r = query(SELECT * FROM TBL_WHATEVER ORDER BY TS ASC);
$last_year = null;

while($row as mysql_fetch_assoc($r)){
    $year = date('Y', $r['ts']);

   if($year != $last_year){
     echo $year;
     $last_year = $year;
   }else{
       $month = 1;
       while($month < 12){
           echo date('F', $r['ts']);
       }
    }

}

これについては、次のような多くの投稿があります。

PHP:日付範囲内のすべての月をループしますか?

于 2012-06-26T12:18:48.053 に答える