如何解决循环播放日期-显示第一个/跳过其余
聊天具有来自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 举报,一经查实,本站将立刻删除。