【问题标题】:Sum the leave hours from the presence in an array对数组中存在的休假时间求和
【发布时间】:2019-11-14 21:46:08
【问题描述】:

我想计算每个员工的休假时间。

我有以下表格:

出席率(id、empid、check_in、check_out、date)列

离开 with(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 或 PHP 中执行此操作吗?你标记了两者。
  • 有人能解释一下这条线背后的逻辑吗leave long for employee with ID 3 = 24 hours and leave long fro employee with ID 8 = 0 hours
  • 欢迎来到 Stack Overflow。我希望您没有在这个问题中分享机密或机密数据。此外,请查看How To Ask。最好分享您迄今为止尝试过的内容以及遇到的潜在错误。
  • 为什么 id 3 的预期答案是 24?不应该是 16 + 16 + 16 + 8.0 + 8.0 = 64,还是要检查唯一性?
  • @Qirel 我在 php 中工作,但我也标记了 java 脚本,因为我只是想知道这个概念。然后我可以在两者中编码

标签: php arrays laravel arraylist


【解决方案1】:

在这种情况下,您可以使用 foreach 将数据与 empid 进行分组,

$temp = [];
foreach ($arr as $key => $value) {
    // fetching all data as per empid and leave id 
    $temp[$value['empid']][$value['leaveId']][] = $value['leaveLong'];
}
$result = [];
foreach ($temp as $key => $value) {
    foreach ($value as $key1 => $value1) {
        // fetching max value for empid and leave id
        $result[$key][$key1] = max($value1);        
    }   
}
// summing per emp id
$result = array_map("array_sum", $result);
print_r($result);

Demo.

输出

Array
(
    [3] => 24
    [8] => 0
)

【讨论】:

  • 我想从 empid = 3 和 leaveId = 5 的所有记录中取一个 16,并从 empid = 3 和 leaveId = 15 的所有记录中取一个 8,然后求和 leaveLongs,所以在这种情况下,结果将是24 代表员工 ID 3
  • 我根据您的要求进行了更改。一旦看到演示和输出。
【解决方案2】:

Javascript

编辑:更改了代码以适应最新要求。

什么是概念?我们使用reduce 将结果累积到一个对象中。基本上,我们取一个对象的empid 并从中取出对象内部的一个键。如果键已经存在,我们获取键的现有值并将当前的leaveLong 添加到它,或者如果键不存在,我们从0 开始我们的值,但仍然添加当前的leaveLong 并通过创建一个键值对。

(a[c.empid] || 0) 可以读作:使用给定键的值 if 定义 else 使用 0 作为值。 p>

所以当reduce 遍历我们的整个对象数组时,我们有一个对象将所有empid 保存为键,并将它们各自的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}) 并相应地调整功能。但这只是个人喜好。

【讨论】:

    【解决方案3】:

    对于 JavaScript

    假设我们将数据存储在 empLeave 中

    // Assuming we stored the data in a variable empLeave
    
    // fetch the data in a object format
    let empLeaveArray = JSON.parse(empLeave)
    
    // declare empty object
    let result = {} 
    
    // loop through every object in the data i.e every leave sanctioned
    empLeaveArray.forEach((ele) => {
    // if the employee has already taken a leave add the leave to it
    if(ele.empid in result)
       result[ele.empid] += ele.leavelong
    // if employee has not taken the leave already add the employee to the object
    else
       result[ele.empid] = ele.leavelong
    })
    
    for (let key in result) {
      console.log("employee " + key + " has taken " + result[key] + "leaves");
    }
    

    【讨论】:

      猜你喜欢
      • 2015-09-18
      • 1970-01-01
      • 2019-11-12
      • 2020-06-22
      • 2019-06-16
      • 1970-01-01
      • 2022-12-03
      • 2019-08-20
      • 1970-01-01
      相关资源
      最近更新 更多