Не обращайте внимания на повторяющиеся записи из многомерного массива

1

Я работаю с 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.

Теги:
arrays
multidimensional-array

1 ответ

1
Лучший ответ

Я внес некоторые незначительные изменения в ваш текущий код, см. Комментарии в коде:

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
        )
)
  • 0
    Абсолютно идеально, спасибо
  • 0
    Пожалуйста :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню