Суммируйте часы отпуска от присутствия в массиве - PullRequest
3 голосов
/ 04 июля 2019

Я хочу рассчитать часы отпуска каждого сотрудника.

У меня есть следующие таблицы:

посещаемость со столбцами (id, empid, check_in, check_out, date)

оставить со столбцами (id, empid, причина, 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 часа

Ответы [ 3 ]

2 голосов
/ 04 июля 2019

В этом случае вы можете использовать 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);

Демо .

Выход

Array
(
    [3] => 24
    [8] => 0
)
2 голосов
/ 04 июля 2019

Javascript

РЕДАКТИРОВАТЬ: Изменен код для соответствия новейшим требованиям.

В чем заключается концепция?Мы используем reduce для накопления результатов в объекте.По сути, мы берем empid объекта и делаем из него ключ внутри объекта.Если ключ уже существует, мы берем существующее значение ключа и добавляем к нему текущий leaveLong ИЛИ, если ключ еще не существует, мы начинаем наше значение с 0, но тем не менее добавляем текущий leaveLong икоторые создают пару ключ-значение.

(a[c.empid] || 0) можно прочитать как: использовать значение данного ключа , если определено , иначе использовать 0 какзначение .

Таким образом, когда reduce пробегает весь наш массив объектов, у нас есть объект, который содержит все empid в качестве ключей и их соответствующие значения leftLong в качестве суммарного значения.

РЕДАКТИРОВАТЬ: Перед этим мы должны filter.Мы просто находим первое вхождение LeadId и отфильтровываем все остальные.

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}) и соответственно настроить функцию.Но это всего лишь личное предпочтение.

0 голосов
/ 04 июля 2019

для 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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...