【问题标题】:Sorting array on multiple values - Day and Time based根据多个值对数组进行排序 - 基于日期和时间
【发布时间】:2020-03-20 12:09:17
【问题描述】:

在另一个 question 的一些帮助下,我得到了一个现在已排序的数组,并允许我返回 基于开始时间的正确值。

简化的数组布局现在看起来像这样:

$arr = array (
    array(  'Days' => '1',
            'Start' => '0930',
            'End' => '0945',
            'Site' => 'AA4'),

    array(  'Days' => '12345',
            'Start' => '1200',
            'End' => '1300',
            'Site' => 'EM3'),

    array(  'Days' => '12345',
            'Start' => '0830',
            'End' => '1730',
            'Site' => 'NW1'),

    array(  'Days' => '01',
            'Start' => '1200',
            'End' => '1300',
            'Site' => 'PL1'),

    array(  'Days' => '12345',
            'Start' =>'1730',
            'End' => '2130',
            'Site' => 'RE1')
);

排序使用:

usort($arr, function($a, $b) {
    return (date("N", strtotime($a['Days'])) <=> date("N", strtotime($b['Days']))) * 100 +
           ($b['Start'] <=> $a['Start']) * 10 +
           ($a['End'] <=> $b['End']);
});

以及使用返回的值:

foreach ($arr as $i => $values) {
    if (strpos($values['Days'], $today) === false ) continue;

    if ($time >= $values['Start'] && $time <= $values['End']) {
        $site = $values['Site'];
        break;
    }
}

echo "$daysofWeek[$today] @ $time Site => $site";

除了按开始时间排序外,我还需要对Days 进行排序。 Sunday = 0, Saturday = 6.

因此,使用上述数组示例,周一至周五 (12345) 介于 0830-1730 之间,正确的站点将是 NW1。 但是,仅在星期一的 0930-0945 之间,该站点将是 AA4

我遇到的问题是周日和周一 1200-1300 之间的站点应该是 PL1,但它匹配 EM3 会有更多的时间/规则添加到这里,但这是基本的想法。

目的是允许用户设置日期和时间,但如果有更直接的匹配,则覆盖它们。

我曾想过在当前排序之后添加一个额外的排序,并根据 Days 中值的数量进行排序。但这似乎打破了原来的排序。

有什么办法吗?

谢谢

**** 更新 **** Link 展示了我目前的成果。

【问题讨论】:

    标签: php arrays sorting time days


    【解决方案1】:

    像这个例子一样使用 array_multisort 来对两列或更多列进行排序:

    array_multisort(array_column($filter_arr, 'Route'), array_column($filter_arr, 'deviceName'),  SORT_ASC, array_column($filter_arr, 'startTime'), SORT_ASC, $filter_arr);
    

    【讨论】:

    • 我试过用这个,但似乎总是把以前的排序搞砸了,所以虽然天数是正确的,但开始时间已经过了。
    • @Rocket 出了什么问题它不是正确的答案?星期一@ 1201 站点 => PL1
    • 我将进行一些额外的测试,并让您知道我的进展情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多