【问题标题】:Diff two multidimensional arrays in PHP在 PHP 中区分两个多维数组
【发布时间】:2016-12-06 11:57:39
【问题描述】:

我必须为调度软件编写一些代码,以显示讲师是否有空。

所以我做了以下(月)期间:

    $begin = new \DateTime('first day of this month');
    $end = new \DateTime('last day of this month');

    $dailyInterval = new \DateInterval('P1D');
    $dailyPeriod = new \DatePeriod($begin, $dailyInterval, $end);
    $data = [];

    /** @var \DateTime $date */
    foreach($dailyPeriod as $date)
    {
        $currentDate = $date->format('Y-m-d');
        $start = new \DateTime("$currentDate 08:00");
        $finish = new \DateTime("$currentDate 20:00");

        $appointmentInterval = new \DateInterval($appointmentVariant->getInterval());
        $appointmentPeriod = new \DatePeriod($start, $appointmentInterval, $finish);

        /** @var \DateTime $duration */
        foreach($appointmentPeriod as $duration)
        {
            $endDate = clone $duration;
            $data['availability'][$currentDate][] = [
                'start' => $duration->format('H:i:s'),
                'end' => $endDate->modify('+90 minutes')->format('H:i:s')
            ];
        }
    }

这个的输出如下:

availability: [
    '2016-12-01': [
        0: ['start': '08:00:00', 'end': '09:30:00'],
        1: ['start': '09:30:00', 'end': '11:00:00'],
        2: ['start': '11:00:00', 'end': '12:30:00'],
        3: ['start': '12:30:00', 'end': '14:00:00'],
        4: ['start': '14:00:00', 'end': '15:30:00'],
        5: ['start': '15:30:00', 'end': '17:00:00'],
        6: ['start': '17:00:00', 'end': '18:30:00'],
        7: ['start': '18:30:00', 'end': '20:00:00']
    ]
]

但是现在我们必须在讲师不可用时从数据库中取出(这可能来自多个来源,约会,假期,重复事件等),所以最后我们有了上面的数组,但是不可用:

unavailability: [
    '2016-12-01': [
        0: ['start': '14:30:00', 'end': '16:30:00'],
        1: ['start': '18:00:00', 'end': '18:20:00'],
    ]
]

现在的问题是,当讲师有空时,如何区分这两个数组以获得最终结果?循环可用的日期和时间以及不可用的日期和时间非常困难。

差异应该给我以下结果(DEL =删除):

availability: [
    '2016-12-01': [
        0: ['start': '08:00:00', 'end': '09:30:00'],
        1: ['start': '09:30:00', 'end': '11:00:00'],
        2: ['start': '11:00:00', 'end': '12:30:00'],
        3: ['start': '12:30:00', 'end': '14:00:00'],
        DEL 4: ['start': '14:00:00', 'end': '15:30:00'],
        DEL 5: ['start': '15:30:00', 'end': '17:00:00'],
        DEL 6: ['start': '17:00:00', 'end': '18:30:00'],
        7: ['start': '18:30:00', 'end': '20:00:00']
    ]
]

有人知道最有效的方法吗?

【问题讨论】:

    标签: php multidimensional-array diff scheduling


    【解决方案1】:

    尝试将一天分成 10 分钟的时间段。然后,您可以根据数据库的不可用性取消设置这些。

    然后您可以使用当天的最小值/最大值输出开始和结束。

    希望这会有所帮助。

    【讨论】:

    • 谢谢你的提示。你是对的,把一天分成 10 分钟更容易处理
    【解决方案2】:
    $unavailability = your unavailability array();
    $availability   = your availability array();
    //this loop will procedd how much your availability in your ex : will be 1
    foreach($availability as $key=>$val)
    {
        if(isset($unavailability[$key]))
        {
           //6 times loop
           foreach($val as $new_key => $new_val)
           {
                2 times loop
                foreach($unavailability[$key] as $unavailkey => $unavail_val)
                {
                    if($new_val['start'] >= $unavail_val['start'])
                    {
                       unset($new_val)
                    }
                    else
                    {
                       continue;
                    }
                }
           }
        }
        else
        {
           continue;
        } 
    
    }
    

    如果您的设计结果数据过于复杂,这非常棘手,可能会让您面临性能问题。

    也可以使用关联数组,但是代码会变脏

    祝你好运

    【讨论】:

    • 感谢 Evinn,它确实给了我一些想法。我面临的最大问题是性能问题。所以,最后我不得不重新思考差异的整个想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    相关资源
    最近更新 更多