员工单独工作时间安排

2024-02-09

我有工作人员的时间清单。我需要查明是否有员工单独工作以及他们一天单独工作了多少分钟

| staff| start | end   |
|:---  |:---   |:---   |
| 1    | 11:05 | 20:00 | 
| 2    | 11:00 | 17:00 |
| 3    | 19:00 | 03:00 |
| 4    | 13:00 | 20:00 |
| 5    | 19:00 | 03:00 |

With 安德烈亚斯的帮助 https://stackoverflow.com/a/45132005/2943403,以下是获取第一个和最后一个单独工作的人的代码,但它不太正确。因为如果有3个时间不同的人单独工作的话,就会出现问题。https://3v4l.org/6OmjO https://3v4l.org/6OmjO

$staff = array(1,2,3,4,5);
$start = array("11:05", "11:00", "19:00", "13:00", "19:00");
$end = array("20:00", "17:00", "03:00", "20:00", "03:05");

array_multisort($start, $end, $staff);

$aloneStart = (strtotime($start[1]) - strtotime($start[0])) / 60; // first and second items are the ones that may be working alone at start
$aloneEnd = (strtotime($end[count($end) - 1]) - strtotime($end[count($end) - 2])) / 60; // last and second to last are the ones that may be working alone at end

if ($aloneStart > 0)
{
    $staffAloneStart = $staff[0]; //must be the first who worked alone
    echo "minutes alone at start: " . $aloneStart . " and it was " . $staffAloneStart . "\n";
}

if ($aloneEnd > 0)
{
    $staffAloneEnd = $staff[count($end) - 1]; // must be the last to end that worked alone
    echo "minutes alone at end: " . $aloneEnd . " and it was " . $staffAloneEnd . "\n";
}

$aloneTime = intval($aloneStart) + intval($aloneEnd);
echo "total time alone " . $aloneTime;

通过下面的数组,您将看到第一个用户的分钟数需要超过 5 分钟,因为他在晚上独自工作的时间更多。

$staff = array(1, 2, 3, 4, 5);
$start = array("11:05", "11:10", "19:00", "13:00", "19:00");
$end = array("20:00", "17:00", "03:00", "16:00", "03:00");

我正在完全重写我的答案,以便它清晰并按正确的顺序流动。我对之前的方法做了一些小的改进,但没有什么大的改进。

首先是数据准备代码。我转换OPhh:mm进出时间值设置为简单的分钟值,同时将员工 ID 保留为键。

// My test data in OP's format to start with:
$staff=[1,2,3];
$start=['11:00','13:00','17:00'];
$end=['21:00','15:00','19:00'];

// My data preparation method:
foreach($staff as $i=>$v){
    $on=explode(':',$start[$i]);  // separate hh from mm of start of shift
    $on_minutes=$on[0]*60+$on[1];  // calculate total minutes from start of day
    $off=explode(':',$end[$i]);   // separate hh from mm of end of shift
    $off_minutes=($off[0]+($on[0]>$off[0]?24:0))*60+$off[1];  // calculate minutes from start of day, factoring shift that run past midnight
    $shifts[$v]=[$on_minutes,$off_minutes];  // store prepared data for future processes
}
/*
  (new prepared array):
  $shifts=[
    1=>[660,1260],
    2=>[780,900],
    3=>[1020,1140]
  ];
*/

这是数据处理片段。我建立了一条捷径——如果一名员工与另一名员工共享相同的轮班,那么第一位员工将立即被视为独处时间为零(显然)。否则,将一名员工的轮班与其他员工的轮班进行一一比较,以确定他们独处的分钟数。

function whittle($colleague_shifts,$pieces_of_shift){  // initially, PoS is only one element
    foreach($colleague_shifts as $k=>$cs){
        foreach($pieces_of_shift as $i=>$ps){
            if($cs[0]<=$ps[0] && $cs[1]>=$ps[1]){
                unset($pieces_of_shift[$i]);
                continue;  // fully covered by coworker
            }
            $temp=[];
            if($ps[0]<$cs[0] && $cs[0]<$ps[1]){
                $temp[]=[$ps[0],$cs[0]];    // push new unmatched start into temp PoS array
            }
            if($ps[1]>$cs[1] && $cs[1]>$ps[0]){
                $temp[]=[$cs[1],$ps[1]];    // push new unmatched end into temp PoS array
            }
            if($temp){
                array_splice($pieces_of_shift,$i,1,$temp);  // replace the current PoS with 1 or 2 new PoS subarrays
            }
        }
        if(!$pieces_of_shift){
            return 0;  // no minutes alone
        }
    }
    // subtract all end alone minutes from all start alone minutes
    return array_sum(array_column($pieces_of_shift,1))-array_sum(array_column($pieces_of_shift,0));
}

foreach($shifts as $id=>$s){
    $colleague_shifts=array_diff_key($shifts,[$id=>'']);  // generate array excluding target worker's shift
    if(in_array($s,$colleague_shifts)){  // check for same start and end times elsewhere
        $alone[$id]=0;  // exact duplicate allows shortcut as "never alone"
    }else{
        $alone[$id]=whittle($colleague_shifts,[$s]);  // whittle down times where target employee is alone
    }
}
var_export($alone);

Output:

array (
  1 => 360,  // alone from 11am-1pm, 3pm-5pm, and 7pm-9pm
  2 => 0,   // never alone
  3 => 0,   // never alone
)

帮助您了解内部发生的事情whittle()

  • 工作人员 #1 从一整班开始660 to 1260. ($pieces_of_shift是一个只有一个子数组的数组,子数组有两个元素 - 开始分钟和结束分钟)
    $pieces_of_shift=[[660,1260]];
  • 与 2 号员工进行比较后,原来的$pieces_of_shift子数组被两个新的子数组替换——轮班开始时的单独时间和轮班结束时的单独时间:660 to 780 and 900 to 1260.
    $pieces_of_shift=[[660,780],[900,1260]];
  • 然后,将员工#3 的班次与员工#1 的两个剩余独处时间范围进行比较。员工 #3 的轮班不与第一个子阵列的任何部分重叠,但在第二个子阵列中却重叠。这意味着第二个时间范围将被替换,以有效地“消除”轮班时间的重叠。
    $pieces_of_shift=[[660,780],[900,1020],[1140,1260]];
  • 这导致员工 #1 的轮班有 3 个“独处”时间:660 to 780, 900 to 1020, and 1140 to 1260。这 3 个单独时间范围(每个 2 小时)相当于 6 小时的单独工作时间或 360 分钟。

Here is 带有附加评论的演示 http://sandbox.onlinephpfunctions.com/code/ca8e0ae26d8c562f35d763e1841be63acbc37dd2.


如果特定批次中存在高概率或大量重复班次,则内部的总迭代次数whittle()可以通过写来减少$colleague_shifts=array_map('unserialize', array_unique(array_map('serialize', $shifts)))在第一个之前foreach() loop.

就此而言,同样的多功能方法could用于在调用之前快捷地执行多个重复的班次foreach($shifts...),但我选择不实现该方法,因为它可能不值得进行卷积。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

员工单独工作时间安排 的相关文章

  • 如何在php中使用preg添加html属性

    我正在寻找在 php 中编写一个脚本来扫描 html 文档并根据它找到的内容向元素添加新标记 更具体地说 我是扫描文档并为每个元素搜索CSS标记 float right left 如果找到它 它会添加align right left 基于它
  • 将 MySQL 结果作为 PHP 数组

    mysql 表 config name config value allow autologin 1 allow md5 0 当前的 php 代码 sth mysql query SELECT rows array while r mysq
  • Zend Framework Zend_Form 装饰器: 位于按钮元素内部?

    我有一个像这样创建的按钮元素 submit new Zend Form Element Button submit submit gt setLabel My Button submit gt setDecorators array Vie
  • 在 PHP 中模拟 jQuery.ajax 请求

    我必须在 PHP 中模拟 AJAX 请求 就像在 jQuery 中一样 我当前的代码在这里 原始 AJAX 调用 不得修改 ajax type POST url someFile php data data success function
  • 如何在 Zend Framework 中处理移动设备?

    我接手了一个噩梦般的项目 我正在迁移一个写得很差的站点 并慢慢地将其迁移到 Zend Framework 应用程序中 不幸的是 我没有时间做补救工作 使这变得可以忍受 也许是一个或两个模型 我现在被告知该网站很快就会有移动版本 建议是克隆旧
  • Ruby 中的 DateTime.parse() 是否依赖于语言环境?

    我想知道以下示例的输出 解析时01 03 它会被解决为Mar 1st or Jan 3rd Ruby 不依赖于语言环境 因为红宝石是一个服务器端语言而不是客户端像 JavaScript 一样的语言 Ruby 使用系统时钟yourWeb 应用
  • PHP - 扩展 __construct

    我想知道你是否可以帮助我 我有两个类 一个扩展了另一个 B 类将由各种不同的对象扩展 并用于常见的数据库交互 现在我希望 B 类能够处理其连接和断开连接 而无需来自 A 类或任何外部输入的指示 据我了解 问题是扩展类不会自动运行其 cons
  • 如何在 WordPress 中按类别获取所有帖子

    我想在 WordPress 中按类别获取帖子 args array post type gt project postslist get posts args 0 gt WP Post 对象 ID gt 421 post author gt
  • PHP、jQuery 和 Ajax 调用乱序

    我正在使用 jQuery 进行 Ajax 调用 我有 x 数量的 Ajax 调用附加到 div 这些 Ajax 加载请求是由 PHP foreach 循环生成的 问题是它们渲染的顺序不正确 它们被设置在数组中
  • 如何处理 AJAX 请求中的会话超时

    我相信你们都熟悉使用 AJAX 的投票系统 嗯 看那边 我有类似的东西 当你投票赞成或反对时 它使用 AJAX 从 votes php 请求新值 问题是我正在使用会话来获取用户 ID 因此一个人只能投票一次 如果他们在页面上坐了一个小时然后
  • 在 null laravel 上调用成员函数 save()

    大家好 我正在使用 laravel 5 多态关系将数据保存在数据库中 但我遇到了一些问题 当我尝试将数据保存在数据库中时 它会抛出此错误 对 null 调用成员函数 save 我不知道为什么我会遇到这个错误 我正在关注多态关系的本教程在 L
  • 如何在 Smarty 中打印 json

    我从 api 获取 json 如何使用 Smarty 打印 json Json格式 first name jinu last name mk loginid email protected cdn cgi l email protectio
  • 重新排列数组键 php [重复]

    这个问题在这里已经有答案了 我有这个数组 Array 15 gt 13 1 16 gt Mark one answer 19 gt You see a car on the hard shoulder of a motorway with
  • 具有更改用户代理上下文的 file_get_contents 不起作用

    我正在尝试获取页面的阅读数和点赞数 网址是 https mp weixin qq com s NPavBeHc8VdWXeSL6kfLRg https mp weixin qq com s NPavBeHc8VdWXeSL6kfLRg 您必
  • 如何解决 Laravel 8 UI 分页问题?

    我在尝试最近发布的 laravel 8 时遇到了问题 我试图找出变化是什么以及它是如何工作的 当我这样做时 我遇到了分页 laravel 8 UI 变得混乱的问题 不知何故它发生了 有人可以帮助我吗 或者经历过同样的事情 像这样我在 lar
  • CSS 无法从带有 php“includes”的相对路径工作

    文件夹结构 index php includes header html css style css 我的主项目文件夹中有 2 个子文件夹 一个是名为 includes 的文件夹 另一个名为 css 我有我的 index php主文件夹中的
  • 简单的dom php解析获取自定义数据属性值

    HTML div class something ddsf PHP foreach dom gt find something data rel as this var dump this gt attr 我尝试了这个但错误 在其文档中找不
  • 显式删除会话cookie会产生什么影响?

    我使用 php session 来维护用户的会话 Session 在登录后创建 在注销或超时后销毁 我需要管理面板中的一个选项来强制注销任何用户 如果他在网站上处于活动状态 我怎样才能做到这一点 我正在考虑删除临时会话文件 这应该有效地破坏
  • 合并 url 中的 2 个输入值

    我有这样的形式
  • 使用“INSERT ... ON DUPLICATE KEY UPDATE”插入多条记录

    我的表结构 table marks 我的目标 我想用条件插入或更新多条记录 我目前正在通过此查询进行检查 第一步 SELECT FROM marks WHERE student 115 AND param 1 第二步 if records

随机推荐

  • 如何处理数据透视表中的重复条目以及如何在 Excel 仪表板中填充查询

    我有两张桌子capacity and demand 容量表如下所示 RESOURCE NAME SKILL GROUP PROJECT START DATE END DATE COST PER HOUR CAPACITY Resource
  • 分片数据库的 ID 生成(Azure 联合数据库)

    我一直在寻找一些有关 Azure 联合数据库 id 生成 联合 主键 最佳实践的文章或指南 但没有发现任何引人注目的内容 联合表不支持标识列 因此在我看来唯一实用的 id 类型是 GUID 因为尝试集中创建和使用 BigInt 会在应用程序
  • 将 xib 文件替换为 App 委托类中的 Main.storyboard 文件

    现在项目正在应用程序委托类中使用 MainWindow xib 作为主 nib 文件 main m 文件中有此代码 int main int argc char argv NSAutoreleasePool pool NSAutorelea
  • Bootstrap 4 的数据表看起来很混乱

    当尝试将 Datatables 与 Bootstrap 4 一起使用时 它看起来不太好 我尝试遵循数据表网站上的基本示例 但它看起来仍然像这样 请参见下面的屏幕截图 我链接到 Datatables 在其自定义页面上提供的文件 这是我的 ht
  • GWT/GXT 标签编辑器? [复制]

    这个问题在这里已经有答案了 我正在寻找基于 GWT 或 GXT 的标签编辑器控件 类似于http tagedit webwork albrecht de http tagedit webwork albrecht de or http le
  • Bean 方法验证

    public class Register NotNull private String password NotNull private String passwordRepeat AssertTrue private boolean c
  • 使用 Java 1.6 和 Windows 7 操作系统进行深度递归时出现 java.lang.StackOverflowError

    我有一个程序 在执行时会遇到非常深的递归 在这中间 我得到java lang StackOverflowError我的应用程序冻结了 我使用的是 JDK 1 6 和 Windows 7 操作系统 奇怪的是 我不明白这个StackOverfl
  • 与内存相关的“竞技场”一词的含义是什么?

    我正在读一本关于内存作为编程概念的书 在后面的一章中 作者大量使用了这个词arena 但从未定义它 我搜索了这个词的含义以及它与记忆的关系 但一无所获 以下是作者使用该术语的一些上下文 序列化的下一个例子采用了一种称为 从特定的内存分配ar
  • iPhone 应用程序在后台运行 10 分钟后终止

    我正在开发一个需要在 iOS4 上后台运行的应用程序 我 希望它像常规的基于位置的应用程序一样 因此背景模式是 设置为位置 应用程序进入后台后运行良好 状态 但 10 分钟后 它不再响应 或许它 被暂停 终止 我想做的是永远在后台运行应用程
  • 为什么我不能在任何方法之外修改类成员变量? [复制]

    这个问题在这里已经有答案了 我有一个带有一些变量的类 当我在主类中实例化该类的对象时 我只能访问和修改一个方法中的成员变量 任何方法 不在他们之外 这是为什么 我被困住了 似乎无法在谷歌上找到答案 class SomeVariables S
  • 第一次尝试简单的 GUI

    我正在尝试自学如何使用 Java swing 和 Window Builder Pro 制作 GUI 在观看了几个 youtube 视频并阅读了一些教程后 我已经完成了以下任务 import javax swing JFrame impor
  • 按带有日期值的单个键对对象数组进行排序

    我有一个包含多个键值对的对象数组 我需要根据 updated at 对它们进行排序 updated at 2012 01 01T06 25 24Z foo bar updated at 2012 01 09T11 25 13Z foo ba
  • Jsoup SocketTimeoutException:读取超时

    I get a SocketTimeoutException当我尝试使用 Jsoup 解析大量 HTML 文档时 例如 我得到了一个链接列表 a href www domain com url1 html link1 a a href ww
  • 将列添加到数据框,测试其他列中的分类变量

    我已经提到过 如何根据另一列的条件语句将因子列添加到数据框 https stackoverflow com questions 16570302 how to add a factor column to dataframe based o
  • 如何实现可重用的回调函数

    我对 JavaScript 相当陌生 我在 Node 中工作 这需要对异步编程和回调设计有很好的理解 我发现使用嵌入式函数非常容易 即使您的回调是多个级别的深度 您的嵌入式回调最终会成为闭包 但是 当您有多层回调 其中许多回调在执行路由上是
  • 为什么我的 Jasmine 规范认为我的 Angular 模块未定义

    为什么我的 Jasmine 规范认为我的 Angular 模块未定义 我在实际模块代码下方添加了一行代码 将布尔值设置为 true 然后我从规范中对其进行 console log 它指示 true 我还尝试更改模块 使其不是超范围 我的术语
  • ansible kubectl 等待节点就绪

    是否有任何现有的 ansible 模块可以用于以下用途 我可以等待kubectl get nodes STATUS Ready kubectl get nodes NAME STATUS ROLES AGE VERSION master1
  • 如何读取和处理(解析)命令行参数?

    在Python中 我们如何找到为脚本提供的命令行参数并处理它们 Related background reading What does sys argv 1 mean What is sys argv and where does it
  • 在位数组中有效查找“1”的位置

    我正在连接一个程序来测试一组电线的开路或短路情况 该程序在 AVR 上运行 将测试向量 步行 1 驱动到电线上并接收返回结果 它将所得向量与已存储在 SD 卡或外部 EEPROM 上的预期数据进行比较 这里有一个例子 假设我们有一组 8 根
  • 员工单独工作时间安排

    我有工作人员的时间清单 我需要查明是否有员工单独工作以及他们一天单独工作了多少分钟 staff start end 1 11 05 20 00 2 11 00 17 00 3 19 00 03 00 4 13 00 20 00 5 19 0