循环播放日期-显示第一个/跳过其余

如何解决循环播放日期-显示第一个/跳过其余

聊天具有来自sql数据库的消息日期。时间戳以PHP日期格式化:

 $dateabove = date("d.m.Y : H:i",$row['message_time']);

日期处于循环中(同时):-

今天必须显示今天,昨天必须显示昨天。然后只有日期到了。 它看起来应该像Whatsapp

示例:- ($ dateabove-$ row ['message_text']):

me: 28.10.2020 : 13:75  - Hello

you: 28.10.2020 : 14:01  - Hello

me: 31.10.2020 : 11:01  - How are you?

you: 31.10.2020 : 12:01  - fine

me: 01.11.2020 : 10:05  -  Where you from?

应如下所示:

*28.10.2020*

me: 28.10.2020 : 13:75  - Hello

you: 28.10.2020 : 14:01  - Hello


*Yesterday*

me: 31.10.2020 : 11:01  - How are you?

you: 31.10.2020 : 12:01  - fine


*Today*

me: 01.11.2020 : 10:05  -  Where you from?

问题是,如何只在循环中的第一条消息上方显示日期,而在该日的后续消息上却不显示

这是我的循环的样子:

while ($row = $db->sql_fetchrow($result));

for ($i = 0,$size = sizeof($rowset); $i < $size; $i++)
{
echo $row['message_time']);
}

解决方法

这是一种可行方法的一点证明。请阅读评论以获取详细信息。请参见this eval进行实时演示。您可以试用它,并查看其输出。

<?php

// Current time as UNIX timestamp.
$now = time();
// Find yesterday's date by subtracting one day ('P1D') from today (new DateTime).
$yesterday = (new DateTime)->sub(new DateInterval('P1D'));

// Mock a bunch of messages.
$messages =
[
    // Yesterday's messages
    [
        'user_id' => 1,'user_natural_name' => 'me',// format('U') will give us UNIX timestamp.
        'timestamp' => $yesterday->setTime(19,0)->format('U'),'text' => 'Hiya'
    ],[
        'user_id' => 2,'user_natural_name' => 'you','timestamp' => $yesterday->setTime(19,5)->format('U'),'text' => 'Hey,how are you?'
    ],// Today's messages
    [
        'user_id' => 1,'timestamp' => $now,'text' => 'Hello'
    ],// Three seconds later.
        'timestamp' => $now + 3,'text' => 'Hi'
    ],[
        'user_id' => 1,'timestamp' => $now + 6,'text' => 'What\'s up'
    ],'timestamp' => $now + 9,'text' => 'Not much'
    ],'timestamp' => $now + 12,'text' => 'Awesome'
    ]
];

// If $lastWindowDate differs from the current message in the queue,// then display it as a separator between day-to-day conversations.
$lastWindowDate = NULL;

// $index will tell us whether we already had output from earlier days so we can
// show a separating newline.
foreach ($messages as $index => $message)
{
    // Window as a perspective on the message flow.
    $windowDate = date('Ymd',$message['timestamp']);
    // If current message's date is not last message's date,then output it to the user.
    if ($windowDate !== $lastWindowDate)
    {
        // Translate today's YMD and yesterday's YMD to something more naturally interpretable for a better UX.

        // Compare against current message's datestamp.
        switch (date('Ymd',$message['timestamp']))
        {
            // date('Ymd') without a second argument defaults to 'today'.
            case date('Ymd'):
                $dateLabel = 'today';
            break;
            // Format $yesterday DateTime as Ymd.
            case $yesterday->format('Ymd'):
                $dateLabel = 'yesterday';
            break;
            // Neither? Pass through as numeric date.
            default:
                $dateLabel = $windowDate;
            break;
        }
        
        // Already had previous output? Show a newline now as visual separator.
        if ($index)
            echo "\n";

        // Output date label at the top of message list for that day.
        echo "$dateLabel\n";
        
        // Reset the last date seen for the conditional to work.
        $lastWindowDate = $windowDate;
    }
 
    // Show message.   
    echo "{$message['user_natural_name']}: " . date('d.m.Y : H:i',$message['timestamp']) . " - {$message['text']}\n";
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?