尝试按PHP在日期中对事件进行分组

时间:2012-06-14 01:24:54

标签: php mysql date grouping

我正在从数据库中获取事件列表,并尝试将类似日期与一个标题关联起来。截至目前,我正在根据请求使用<dl> <dt> <dd>等。这可能会改变,但我认为这不会影响我的问题的整体影响。

基本上我试图通过查询抓住5个最新的事件:

global $wpdb;

$sql = "SELECT e.*, c.*, ese.start_time, ese.end_time
        FROM wp_events_detail e
        JOIN wp_events_category_rel r ON r.event_id = e.id
        JOIN wp_events_category_detail c ON c.id = r.cat_id
        LEFT JOIN wp_events_start_end ese ON ese.event_id= e.id 
        WHERE e.is_active =  'Y'
        AND c.category_identifier = 'main'
        ORDER BY e.start_date ASC
        LIMIT 0, 5";
$results = $wpdb->get_results($sql);

然后我将它们循环到foreach()

if(count($results) > 0) {

    echo '<div class="calendar-list">';

    foreach($results as $event) {

        $event_id = $event->id;
        $event_name = $event->event_name;
        $start_date = $event->start_date;
        $start_time = $event->start_time;

        $start_time = strtotime($start_time);
        $start_time = date('g:ia', $start_time);

        $the_time =  strtotime($start_date);

        $the_day = date('d', $the_time);
        $the_month = date('M', $the_time);

        echo '<dl class="calendar-day first-child">';
        echo '<dt>';
        echo '<p class="the-month">' . $the_month . '</p>';
        echo '<p class="the-day">' . $the_day . '</p>';
        echo '</dt>';
        echo '<dd>';
        echo '<h4><a href="' . $event_id . '">' . $event_name . '</a></h4>';
        echo '<h5><span class="time">' . $start_time . '</span></h5>';
        echo '</dd>';
        echo '</dl>';

    }

    echo '</div>';
}

我的主要问题是我需要想办法将日期彼此关联起来。例如,6月27日。如果有两个日期,我希望它看起来像:

<div class="calendar-list">
    <dl class="calendar">
        <dt>
            <p class="the-month">JUN</p>
            <p class="the-day">27</p>
        </dt>
        <dd>
            <h4><a href="#">Title</a></h4>
                        <h5><span class="time">Time</span></h5>
        </dd>
        <dd>
            <h4><a href="#">Title</a></h4>
                        <h5><span class="time">Time</span></h5>
        </dd>
    </dl>
    <dl class="calendar">
        <dt>
            <p class="the-month">JUN</p>
            <p class="the-day">28</p>
        </dt>
        <dd>
            <h4><a href="#">Title</a></h4>
                        <h5><span class="time">Time</span></h5>
        </dd>
        </dl>
</div>

我不确定如何实现这一目标。我一直在玩设置和取消一些变量,但一直无法达到理想的结果。

如果有人能指出我正确的方向,那将是非常感激的。

谢谢!

2 个答案:

答案 0 :(得分:1)

基本上,您必须记住循环结束时每行的$the_time,并将其与当前$the_time进行比较,以确定是否必须回显新的<dt>。不过,事实上每天都有自己的<dl>使事情变得复杂。这是一个丑陋的解决方案:

// Init empty previous time
$previous_time = null;
// Open first definition list
echo '<dl class="calendar-day first-child">';
foreach($results as $event) {

    $event_id = $event->id;
    $event_name = $event->event_name;
    $start_date = $event->start_date;
    $start_time = strtotime($event->start_time);
    $the_time = $start_time;
    $the_day = date('d', $start_time);
    $the_month = date('M', $start_time);
    $start_time = date('g:ia', $start_time);

    // Date changed
    if($the_time != previous_time) {
        // Unless first iteration, close previous list
        if(!empty($previous_time)) {
            echo '</dl>';
        }
        // Open new list
        echo '<dl class="calendar-day first-child">'
        // Show definition term for the group of events
        echo '<dt>';
        echo '<p class="the-month">' . $the_month . '</p>';
        echo '<p class="the-day">' . $the_day . '</p>';
        echo '</dt>';
    }

    // Display current event
    echo '<dd>';
    echo '<h4><a href="' . $event_id . '">' . $event_name . '</a></h4>';
    echo '<h5><span class="time">' . $start_time . '</span></h5>';
    echo '</dd>';

    // Remember date from previous row
    previous_time = $the_time;
}
// Close last definition list
echo '</dl>';

答案 1 :(得分:0)

<?php
//***************************************
/// Read the readme.txt file before using ///////
// This is downloaded from www.plus2net.com //
/// You can distribute this code with the link to www.plus2net.com ///
//  Please don't  remove the link to www.plus2net.com ///
// This is for your learning only not for commercial use. ///////
//The author is not responsible for any type of loss or problem or damage on using   this script.//
/// You can use it at your own risk. /////
//*****************************************

$dbservertype='mysql';
$servername='ur host';
// username and password to log onto db server
$dbusername='ur user';
$dbpassword='ur pwd';
// name of database
$dbname='ur db';

////////////////////////////////////////
////// DONOT EDIT BELOW  /////////
///////////////////////////////////////
connecttodb($servername,$dbname,$dbusername,$dbpassword);
function connecttodb($servername,$dbname,$dbuser,$dbpassword)
{
global $link;
$link=mysql_connect ("$servername","$dbuser","$dbpassword");
if(!$link){die("Could not connect to MySQL");}
mysql_select_db("$dbname",$link) or die ("could not open db".mysql_error());
}
//////// End of connecting to database ////////

// Init empty previous time
 $previous_time = null;

 // Open first definition list
     echo '<dl class="calendar-day first-child">';
    $q1="SELECT * FROM msg WHERE sendto = '1' || sender = '1' ORDER BY time desc";
 $n1=mysql_query($q1);
    while($nt1=mysql_fetch_array($n1)){

 $start_time = strtotime($nt1['time']); //change to string
    $the_time = date('j m', $start_time); //select wat u need i.e day and month

     //$the_time = $nt1['time']);  //for troublshooting db

   // Date changed
if($the_time != $previous_time) {
    // Unless first iteration, close previous list
    if(!empty($previous_time)) {
        echo '</dl>';
    }
    // Open new list
    echo '<dl class="calendar-day first-child">';
    // Show definition term for the group of events
   echo '<h4>'.$nt1['time'].'</h4>';
 }

 // Display current event
echo '<dd>';
echo $nt1['message'] .' '. $nt1['time'];
echo '</dd>';

// Remember date from previous row
$previous_time = $the_time;
 }
 // Close last definition list
 echo '</dl>';

?>


 </body>

       </html>
通过这段经过编辑的代码,你可以按时间分组任何东西