PHP-删除数组中的重叠项

PHP-删除数组中的重叠项,php,arrays,Php,Arrays,我有一个包含开放时间的数组。每个条目都是一个时间框架,商店可以打开 day是0为星期日、1为星期一、2为星期二的一天。。。最多6个星期六 stime是开始开门时间,etime是关门时间 看看下面的例子,我有3个星期三(3)的条目 显然,如果商店营业时间为0900-1700,则不需要其他两个条目,因为它们在这个时间范围内 Array ( [0] => Array ( [day] => 1 [stime] =>

我有一个包含开放时间的数组。每个条目都是一个时间框架,商店可以打开

day
是0为星期日、1为星期一、2为星期二的一天。。。最多6个星期六

stime
是开始开门时间,
etime
是关门时间

看看下面的例子,我有3个星期三(3)的条目

显然,如果商店营业时间为0900-1700,则不需要其他两个条目,因为它们在这个时间范围内

Array
(
    [0] => Array
        (
            [day] => 1
            [stime] => 09 : 00
            [etime] => 17 : 00
        )

    [1] => Array
        (
            [day] => 2
            [stime] => 09 : 00
            [etime] => 17 : 00
        )

    [2] => Array
        (
            [day] => 3
            [stime] => 09 : 00
            [etime] => 12 : 00
        )

    [3] => Array
        (
            [day] => 3
            [stime] => 09 : 00
            [etime] => 17 : 00
        )

    [4] => Array
        (
            [day] => 3
            [stime] => 13 : 00
            [etime] => 17 : 00
        )

    [5] => Array
        (
            [day] => 4
            [stime] => 09 : 00
            [etime] => 17 : 00
        )

    [6] => Array
        (
            [day] => 5
            [stime] => 09 : 00
            [etime] => 17 : 00
        )

)
有没有办法过滤阵列,使其不显示已覆盖的时间范围


谢谢

为此,您可以使用
array\u reduce
,以下是示例:

$result = array_reduce($arr, function($_arr, $item) {
$day = $item['day'];

if (!key_exists($day, $_arr)) {
    $_arr[$day] = $item;
} else {
    if (floatval(str_replace(':', '.', $_arr[$day]['stime'])) > floatval(str_replace(':', '.', $item['stime']))) {
        $_arr[$day]['stime'] = $item['stime'];
    }
    if (floatval(str_replace(':', '.', $_arr[$day]['etime'])) < floatval(str_replace(':', '.', $item['etime']))) {
        $_arr[$day]['etime'] = $item['etime'];
    }
}

return $_arr;
}, []);

sort($result);

print_r($result);

)

您的意思是每天都有多个[TIME]和[etime]键吗?到目前为止,您尝试了什么?你被困在哪里?这看起来是一个很好的测试驱动练习-development@maniksidana对于上面的示例,有3个Wed条目。条目“2”涵盖了条目1和条目3涵盖的时间段,因此不需要使用条目1和条目3。Thanks@NicoHaase谢谢你的回复,我不知道该用这个做什么。到目前为止,我已经将数据放入一个数组,按天和开始时间对该数组进行排序,但现在我需要一个指针,指示如何筛选和删除重叠的条目。谢谢如果同一天有两个时间段不重叠,你预计会发生什么?或者这不会发生吗?谢谢,这很有帮助,但有一个问题。如果周三有以下条目
wed09:00-12:30
wed13:30-17:00
,那么它会显示
wed09:00-17:00
,并且错过了商店在12:30-13:30之间关门的时间。我很高兴看到这一点!您需要调整“其他”部分中的逻辑。:)谢谢你能解释一下这是怎么回事吗。我以前没有使用过array\u reduce。
$result = array_reduce($arr, function($_arr, $item) {
$day = $item['day'];

if (!key_exists($day, $_arr)) {
    $_arr[$day] = $item;
} else {
    if (floatval(str_replace(':', '.', $_arr[$day]['stime'])) > floatval(str_replace(':', '.', $item['stime']))) {
        $_arr[$day]['stime'] = $item['stime'];
    }
    if (floatval(str_replace(':', '.', $_arr[$day]['etime'])) < floatval(str_replace(':', '.', $item['etime']))) {
        $_arr[$day]['etime'] = $item['etime'];
    }
}

return $_arr;
}, []);

sort($result);

print_r($result);
Array
(
  [0] => Array
    (
        [day] => 1
        [stime] => 09:00
        [etime] => 17:00
    )

[1] => Array
    (
        [day] => 2
        [stime] => 09:00
        [etime] => 17:00
    )

[2] => Array
    (
        [day] => 3
        [stime] => 09:00
        [etime] => 17:00
    )

[3] => Array
    (
        [day] => 4
        [stime] => 09:00
        [etime] => 17:00
    )

[4] => Array
    (
        [day] => 5
        [stime] => 09:00
        [etime] => 17:00
    )