php - 对数组中存在的休假时间求和
问题描述
我想计算每个员工的休假时间。
我有以下表格:
使用 (id, empid, check_in, check_out, date) 列的出勤率
离开(id,empid,reason,time_long from_date, to_date) 列
具有 (id,name,....) 列的员工
这是我的查询:
select `emp`.*, `p`.*, `a`.*, `l`.`id` as `leaveId`, `l`.`time_long` as `leaveLong`, `l`.`from_date` as `leaveFrom`, `l`.`to_date` as `leaveTo` from `employee` as `emp` inner join `attendance` as `a` on `emp`.`id` = `a`.`empid` left join `leave` as `l` on `emp`.`id` = `l`.`empid` where `a`.`date` between 2019-03-01 and 2019-03-31 order by `emp`.`id` asc)
查询返回以下记录。
[
{
"log_id": 1310,
"name": "ahmad",
"empid": 3,
"check_in": "11:56",
"check_out": "17:25",
"date": "2019-03-23",
"time_long": "5:28",
"leaveId": 5,
"leaveLong": 16,
"leaveFrom": "2019-03-15",
"leaveTo": "2019-03-17"
},
{
"log_id": 1311,
"name": "ahmad",
"empid": 3,
"check_in": "07:14",
"check_out": "17:24",
"date": "2019-03-24",
"time_long": "10:9",
"leaveId": 5,
"leaveLong": 16,
"leaveFrom": "2019-03-15",
"leaveTo": "2019-03-17"
},{
"log_id": 1312,
"name": "ahmad",
"empid": 3,
"check_in": "06:58",
"check_out": "17:21",
"date": "2019-03-25",
"time_long": "10:23"
"leaveId": 5,
"leaveLong": 16,
"leaveFrom": "2019-03-15",
"leaveTo": "2019-03-17"
},{
"log_id": 1313,
"name": "ahmad",
"empid": 3,
"check_in": "07:58",
"check_out": "17:21",
"date": "2019-03-26",
"time_long": "9:23"
"leaveId": 15,
"leaveLong": 8.0,
"leaveFrom": "2019-03-28",
"leaveTo": "2019-03-29"
},
{
"log_id": 1314,
"name": "ahmad",
"empid": 3,
"check_in": "07:58",
"check_out": "17:21",
"date": "2019-03-26",
"time_long": "9:23"
"leaveId": 15,
"leaveLong": 8.0,
"leaveFrom": "2019-03-28",
"leaveTo": "2019-03-29"
},
{
"log_id": 1315,
"name": "ahmad",
"empid": 3,
"check_in": "08:00",
"check_out": "16:00",
"date": "2019-03-27",
"time_long": "8:00"
"leaveId": 15,
"leaveLong": 8.0,
"leaveFrom": "2019-03-28",
"leaveTo": "2019-03-29"
}
{ ... }
]
所以我期望这个输出有以下结果:
ID 3 员工的假期 = 24 小时
解决方案
Javascript
编辑:更改代码以适应最新要求。
什么概念?我们用来reduce
在一个对象中累积结果。基本上,我们取出一个对象empid
并从中取出对象内部的一个键。如果键已经存在,我们获取键的现有值并将当前值添加leaveLong
到它,或者如果键不存在,我们开始我们的值,0
但仍然添加当前值leaveLong
并创建一个键值对。
(a[c.empid] || 0)
可以读作:如果定义,则使用给定键的值,否则使用 0 作为值。
因此,当reduce
遍历我们的整个对象数组时,我们有一个对象,它将所有empid
的 's 作为键,并将它们各自的 leaveLong 值作为总和值。
编辑:在此之前,我们必须filter
. 我们只需找到第一次出现的 leaveId 并过滤掉所有其余的。
var arr = [{"log_id":1310,"name":"ahmad","fname":"Mohammad","photo":"images/user_profile//1550473469.jpg","title":"Doctor","description":null,"empid":3,"check_in":"11:56","check_out":"17:25","date":"2019-03-23","time_long":"5:28","leaveId":5,"leaveLong":16,"leaveFrom":"2019-03-15","leaveTo":"2019-03-17"},{"log_id":1311,"name":"ahmad","fname":"Mohammad","photo":"images/user_profile//1550473469.jpg","title":"Doctor","description":null,"empid":3,"check_in":"07:14","check_out":"17:24","date":"2019-03-24","time_long":"10:9","leaveId":5,"leaveLong":16,"leaveFrom":"2019-03-15","leaveTo":"2019-03-17"},{"log_id":1312,"name":"ahmad","fname":"Mohammad","photo":"images/user_profile//1550473469.jpg","title":"Doctor","description":null,"empid":3,"check_in":"06:58","check_out":"17:21","date":"2019-03-25","time_long":"10:23","leaveId":5,"leaveLong":16,"leaveFrom":"2019-03-15","leaveTo":"2019-03-17"},{"log_id":1313,"name":"ahmad","fname":"Mohammad","photo":"images/user_profile//1550473469.jpg","title":"Doctor","description":null,"empid":3,"check_in":"07:58","check_out":"17:21","date":"2019-03-26","time_long":"9:23","leaveId":15,"leaveLong":8.0,"leaveFrom":"2019-03-28","leaveTo":"2019-03-29"},{"log_id":1314,"name":"ahmad","fname":"Mohammad","photo":"images/user_profile//1550473469.jpg","title":"Doctor","description":null,"empid":3,"check_in":"07:58","check_out":"17:21","date":"2019-03-26","time_long":"9:23","leaveId":5,"leaveLong":8.0,"leaveFrom":"2019-03-28","leaveTo":"2019-03-29"},{"log_id":1315,"name":"ahmad","fname":"Mohammad","photo":"images/user_profile//1550473469.jpg","title":"Doctor","description":null,"empid":3,"check_in":"08:00","check_out":"16:00","date":"2019-03-27","time_long":"8:00","leaveId":5,"leaveLong":8.0,"leaveFrom":"2019-03-28","leaveTo":"2019-03-29"},{"log_id":1316,"name":"Neda Mohammad","fname":"Gada Mohammad","photo":"images/user_profile//1550473758.jpg","title":"Pharmacist","description":null,"empid":8,"check_in":"07:36","check_out":"17:57","date":"2019-03-25","time_long":"10:20","leaveId":null,"leaveLong":null,"leaveFrom":null,"leaveTo":null,},{"log_id":1317,"name":"Neda Mohammad","fname":"Gada Mohammad","photo":"images/user_profile//1550473758.jpg","title":"Pharmacist","description":null,"empid":8,"check_in":"08:00","check_out":"16:00","date":"2019-03-26","time_long":"8:00","leaveId":null,"leaveLong":null,"leaveFrom":null,"leaveTo":null,},{"log_id":1318,"name":"Neda Mohammad","fname":"Gada Mohammad","photo":"images/user_profile//1550473758.jpg","title":"Pharmacist","description":null,"empid":8,"check_in":"08:00","check_out":"16:00","date":"2019-03-27","time_long":"8:00","leaveId":null,"leaveLong":null,"leaveFrom":null,"leaveTo":null,}];
let res = arr.filter((v,i) => arr.findIndex(o => o.leaveId == v.leaveId) == i)
.reduce((a,c) => {a[c.empid] = (a[c.empid] || 0) + c.leaveLong; return a},{})
console.log(res)
如果您需要一个数组作为答案,请将对象放入Object.entries
.
var arr = [{"log_id":1310,"name":"ahmad","fname":"Mohammad","photo":"images/user_profile//1550473469.jpg","title":"Doctor","description":null,"empid":3,"check_in":"11:56","check_out":"17:25","date":"2019-03-23","time_long":"5:28","leaveId":5,"leaveLong":16,"leaveFrom":"2019-03-15","leaveTo":"2019-03-17"},{"log_id":1311,"name":"ahmad","fname":"Mohammad","photo":"images/user_profile//1550473469.jpg","title":"Doctor","description":null,"empid":3,"check_in":"07:14","check_out":"17:24","date":"2019-03-24","time_long":"10:9","leaveId":5,"leaveLong":16,"leaveFrom":"2019-03-15","leaveTo":"2019-03-17"},{"log_id":1312,"name":"ahmad","fname":"Mohammad","photo":"images/user_profile//1550473469.jpg","title":"Doctor","description":null,"empid":3,"check_in":"06:58","check_out":"17:21","date":"2019-03-25","time_long":"10:23","leaveId":5,"leaveLong":16,"leaveFrom":"2019-03-15","leaveTo":"2019-03-17"},{"log_id":1313,"name":"ahmad","fname":"Mohammad","photo":"images/user_profile//1550473469.jpg","title":"Doctor","description":null,"empid":3,"check_in":"07:58","check_out":"17:21","date":"2019-03-26","time_long":"9:23","leaveId":15,"leaveLong":8.0,"leaveFrom":"2019-03-28","leaveTo":"2019-03-29"},{"log_id":1314,"name":"ahmad","fname":"Mohammad","photo":"images/user_profile//1550473469.jpg","title":"Doctor","description":null,"empid":3,"check_in":"07:58","check_out":"17:21","date":"2019-03-26","time_long":"9:23","leaveId":5,"leaveLong":8.0,"leaveFrom":"2019-03-28","leaveTo":"2019-03-29"},{"log_id":1315,"name":"ahmad","fname":"Mohammad","photo":"images/user_profile//1550473469.jpg","title":"Doctor","description":null,"empid":3,"check_in":"08:00","check_out":"16:00","date":"2019-03-27","time_long":"8:00","leaveId":5,"leaveLong":8.0,"leaveFrom":"2019-03-28","leaveTo":"2019-03-29"},{"log_id":1316,"name":"Neda Mohammad","fname":"Gada Mohammad","photo":"images/user_profile//1550473758.jpg","title":"Pharmacist","description":null,"empid":8,"check_in":"07:36","check_out":"17:57","date":"2019-03-25","time_long":"10:20","leaveId":null,"leaveLong":null,"leaveFrom":null,"leaveTo":null,},{"log_id":1317,"name":"Neda Mohammad","fname":"Gada Mohammad","photo":"images/user_profile//1550473758.jpg","title":"Pharmacist","description":null,"empid":8,"check_in":"08:00","check_out":"16:00","date":"2019-03-26","time_long":"8:00","leaveId":null,"leaveLong":null,"leaveFrom":null,"leaveTo":null,},{"log_id":1318,"name":"Neda Mohammad","fname":"Gada Mohammad","photo":"images/user_profile//1550473758.jpg","title":"Pharmacist","description":null,"empid":8,"check_in":"08:00","check_out":"16:00","date":"2019-03-27","time_long":"8:00","leaveId":null,"leaveLong":null,"leaveFrom":null,"leaveTo":null,}];
let res = Object.entries(
arr.filter((v,i) => arr.findIndex(o => o.leaveId == v.leaveId) == i)
.reduce((a,c) => {a[c.empid] = (a[c.empid] || 0) + c.leaveLong; return a},{}))
console.log(res)
在这两种情况下,您都可以相应地替换(a,c)
和(a, { empid, leaveLong})
调整功能。但这只是个人喜好。
推荐阅读
- google-apps-script - Google App Script Google Doc 替换正文中的文本
- html - 如何使用 CSS 对齐图像旁边的表单元素?
- html - bootstrap 4模板文本格式问题
- python - 使用 wavelink 库对歌曲进行排队的最佳方法是什么?
- performance - 请求“等待”时间很长。您是否看到此 HTTP2.0 标头有任何问题?
- python - 获取边界框opencv的上中心
- python - 使用 PyPy 或 Cython 使用 fsolve 加速循环?
- javascript - 使用 ng-repeat 建表
- c++ - 共享指针不明确的调用/未定义的调用引用
- html - 移动滚动不适用于移动设备