Я работаю с API, который возвращает данные о праздниках для сотрудников. Данные содержат утвержденные праздничные запросы, а также отмененные праздничные заявки. Проблема, с которой я столкнулся, заключается в том, что отмененные запросы на отпуск отображаются как повторяющиеся записи в следующем формате:
stdClass Object
(
[leave_requests] => Array
(
[0] => stdClass Object
(
[employee] => stdClass Object
(
[id] => 30771
)
[reviewed_by] => stdClass Object
(
[id] => 22734
)
[reason] =>
[type] => Holiday
[deducted] => 1.0
[cancelled] =>
[id] => 626214
[start_date] => 2015-08-20
[half_start] =>
[half_start_am_pm] =>
[end_date] => 2015-08-20
[half_end] =>
[half_end_am_pm] =>
[action] => request
[status] => approved
[notes] =>
[created_at] => 2015-08-06T21:55:12+01:00
[updated_at] => 2015-08-07T08:26:07+01:00
)
[1] => stdClass Object
(
[employee] => stdClass Object
(
[id] => 30771
)
[reviewed_by] => stdClass Object
(
[id] => 22734
)
[reason] =>
[type] => Holiday
[deducted] => 1.0
[cancelled] =>
[id] => 632745
[start_date] => 2015-08-20
[half_start] =>
[half_start_am_pm] =>
[end_date] => 2015-08-20
[half_end] =>
[half_end_am_pm] =>
[action] => cancel
[status] => approved
[notes] =>
[created_at] => 2015-08-12T17:50:32+01:00
[updated_at] => 2015-08-12T17:53:46+01:00
)
)
)
В идеале данные будут отформатированы так, чтобы отменилось свойство, и я мог отфильтровать его (это было запрошено разработчиками). Мне бы хотелось удалить обе записи, которые имеют одинаковые start_date и end_date.
В настоящее время я могу удалить дубликат, используя эту функцию
function super_unique($array)
{
$newArr = array();
foreach ($array as $val) {
$newArr[$val['startDate']] = $val;
}
$array = array_values($newArr);
return $array;
}
Пара проблем с этим, в том, что я по-прежнему остался с одной из записей, поскольку запрос на отпуск был отменен, я не хочу, чтобы они были в данных. Фильтрация данных, чтобы исключить все элементы, у которых есть свойство действия "cancel", все равно оставит меня и с исходным запросом.
Другая проблема заключается в том, что указанная выше функция фильтрует только исходную_задачу, а не start_date и end_date.
Просмотрел комментарии по этому вопросу SO и в комментариях на странице doc PHP для array_values и array_unique.
Я внес некоторые незначительные изменения в ваш текущий код, см. Комментарии в коде:
function super_unique($array)
{
$newArr = array();
foreach ($array as $val) {
// Create a key by combining start/end dates
$key = $val['startDate'].$val['endDate'];
// Have we already seen this start/end date combination?
if (array_key_exists($key, $newArr)) {
$val = null; // Clear element value, like "remove this later on"
}
$newArr[$key] = $val; // Add to/update key index (actual value or null)
}
// Remove all elements with unset (null) values
$array = array_filter(array_values($newArr));
return $array;
}
$a = [['startDate' => '2015-08-20', // Exists twice - should be removed
'endDate' => '2015-08-22'],
['startDate' => '2015-08-20', // Unique start/end combination
'endDate' => '2015-08-20'],
['startDate' => '2015-08-21', // Unique start/end combination
'endDate' => '2015-08-21'],
['startDate' => '2015-08-20', // Exists twice - should be removed
'endDate' => '2015-08-22'],
['startDate' => '2015-08-22', // Unique start/end combination
'endDate' => '2015-08-20'],
];
print_r(super_unique($a));
Вывод:
Array
(
[1] => Array
(
[startDate] => 2015-08-20
[endDate] => 2015-08-20
)
[2] => Array
(
[startDate] => 2015-08-21
[endDate] => 2015-08-21
)
[3] => Array
(
[startDate] => 2015-08-22
[endDate] => 2015-08-20
)
)