【问题标题】:How to sort foreach items from SQL by date (Today, Yesterday, 29 Aug, 28, etc.) in PHP?如何在 PHP 中按日期(今天、昨天、8 月 29 日、28 日等)从 SQL 中对 foreach 项目进行排序?
【发布时间】:2020-01-04 06:13:26
【问题描述】:

抱歉,我无法在标题中进一步解释,但这是交易。

我有一个 SQL 表,其中的项目有一个经典的日期列,我在循环中按日期对它们进行排序。现在我想在现有循环中添加echo 以在循环表中显示一行,其中将显示今天添加的项目、昨天添加的项目等等。

这就是我希望它在循环时的样子。 (我得到的最接近的是它每秒循环一次,并为每个项目添加回声部分,这完全是一团糟)

PS:在 google 上阅读也许应该将其作为 usortif 包含在现有的 foreach 中?

----------------------------
Table
----------------------------
echoed `<tr><td>Added: today<td></tr>`
---------------------------
Item 1
Item 2
Item 3
---------------------------
echoed `<tr><td>Added: yesterday<td></tr>`
---------------------------
Item 4
Item 5
Item 6
Item 7
---------------------------
echoed `<tr><td>Added: 29 Aug<td></tr>`
---------------------------
Item 9
Item 10
Item 11
etc

编辑: 日期格式不一定是 8 月 29 日。仅供参考,我会自己调整。我只需要有关如何实现此逻辑的帮助。

【问题讨论】:

  • 请出示您的查询。可以在 MySQL 级别进行排序,您尝试过吗?
  • 不知道mysql能做到。 SELECT * FROM todo_list` ORDER BY added DESC $limit` 我就是这样做的,然后将项目放入 foreach 以作为表格循环。

标签: php mysql loops foreach mariadb


【解决方案1】:

您应该首先在数据库中对它们进行排序!

然后,当您在遍历项目时,您基本上会记住上次显示的部分,并且在输出新部分的第一行之前,您会输出部分标题:

$current = null;

foreach($rows as $row) {
    $display = date_create($row['timestamp'])->format('Ymd');  // or whatever!
    // it must consistently return something that makes the following consistent:
    if($display != $current) {
        // add separator that contains "today" or "yesterday" or the date 
        echo '<tr><td>'.$display.'</td></tr>';
        $current = $display;
    }

    // display the actual row here
}

如果您还想为数据库中不存在的日期显示分隔符行,问题就会变得更加困难。然后,您必须先创建一个日期对象,然后一次减去一天,直到日期与行日期匹配,并相应地输出分隔符。

更新:特殊显示(请注意,$today$yesterday 必须是字符串或 int 等简单类型才能正常工作):

// before the loop!
$today = date_create()->format('Ymd');
$yesterday = date_create("-1 day")->format('Ymd');
$replacements = [
    $today => 'today', // or whatever
    $yesterday => 'yesterday', // or whatever
];

在循环中回显$display:

echo '<tr><td>'.($replacements[$display] ?? $display).'</td></tr>';

如果格式化的日期应该被替换,这会看起来。

【讨论】:

  • 哇!它实际上按我想要的方式工作。需要更多测试来检查是否一切正常。谢谢!顺便说一下今天和昨天的第一天和第二天应该如何格式化,其他形式很容易。
  • 解决了所有问题!太感谢了。现在我了解到格式化日期并不难
【解决方案2】:

您提到您已经根据天数对数据进行了排序,即“添加”字段。

接下来您可以做的是遍历检索到的结果集。这就是你可以继续的方式。

$dtPrevDate = null;

上述变量将用于比较日期,即“添加”。

现在遍历检索到的数据:

foreach($data as $datum){
 if($dtPrevDate == $datum['added']){
  // Keep printing item
 }
 else{
  echo "Item added on: $datum['added']";
 }
 $dtPrevDate = $datum['added'];
}

上述代码的本质取决于您已经使用 MySQL 进行的排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多