【问题标题】:date sorting in array数组中的日期排序
【发布时间】:2020-03-31 12:50:00
【问题描述】:

我很困惑 - 我无法在这段代码 sn-p 中找到错误。

我想按日期对这个数组中的日期排序 - 从下一个日期开始。

<?php

$data = [
  [
    "id" => "3f57dc7c-a698-e911-a95e-000d3a454330",
    "date" => [
        [
        "start_date" => "23.11.2020 07:00",
        "end_date" => "04.12.2020 16:00"
      ],
      [
        "start_date" => "02.03.2020 07:00",
        "end_date" => "13.03.2020 16:00"
      ],
      [
        "start_date" => "06.01.2020 07:00",
        "end_date" => "14.02.2020 21:00"
      ],
      [
        "start_date" => "20.01.2020 07:00",
        "end_date" => "28.02.2020 07:00"
      ],
      [
        "start_date" => "23.03.2020 07:00",
        "end_date" => "03.04.2020 15:00"
      ],
      [
        "start_date" => "31.08.2020 06:00",
        "end_date" => "09.10.2020 15:00"
      ],
      [
        "start_date" => "12.10.2020 06:00",
        "end_date" => "23.10.2020 15:00"
      ]
    ]
  ]
];

foreach ($data as $entry) {
    usort($entry['date'], function($a, $b) {
        $a = DateTime::createFromFormat('d.m.Y H:i', $a['start_date']);
        $b = DateTime::createFromFormat('d.m.Y H:i', $b['start_date']);
        return $a <=> $b;
    });
}

var_dump($data[0]['date']);

在线游乐场:https://3v4l.org/39k53

希望看到另一个有效的解决方案..

【问题讨论】:

  • 请显示想要的结果。
  • 混淆了这是一个错字还是实际上可以回答。

标签: php arrays sorting date


【解决方案1】:

在这种情况下,您可以使用引用 https://www.php.net/manual/en/language.references.whatdo.php

foreach ($data as &$entry) {
    usort($entry['date'], function($a, $b) {
        $a = DateTime::createFromFormat('d.m.Y H:i', $a['start_date']);
        $b = DateTime::createFromFormat('d.m.Y H:i', $b['start_date']);
        return $a <=> $b;
    });
}

【讨论】:

    【解决方案2】:

    我认为这是因为您正在对 $entry['date'] 进行排序,这是循环中的一个临时变量。不会更新父对象中数组副本的排序。

    这样试试,直接访问数组:

    usort($data[0]['date'], function($a, $b) {
        $a = DateTime::createFromFormat('d.m.Y H:i', $a['start_date']);
        $b = DateTime::createFromFormat('d.m.Y H:i', $b['start_date']);
        return $a <=> $b;
    });
    
    var_dump($data);
    

    或者,您可以坚持原来的方法(预期顶级数组中有多个条目),但输出循环中出现的 $entry 的每个单独实例的内容,而不是父级 - 它将被排序:

    foreach ($data as $entry) {
        usort($entry['date'], function($a, $b) {
            $a = DateTime::createFromFormat('d.m.Y H:i', $a['start_date']);
            $b = DateTime::createFromFormat('d.m.Y H:i', $b['start_date']);
            return $a <=> $b;
        });
        var_dump($entry['date']);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 2017-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多