@WeStlik

Как удалить «противоположные» и «похожие» элементы массива?

Есть массив "движений" элементов, примерно такой, только может быть в разы больше:
Исходный массив
Array
(
    [0] => Array
        (
            [id] => 90415
            [oldDate] => 2024-08-27
            [newDate] => 2024-08-28
        )

    [1] => Array
        (
            [id] => 90415
            [oldDate] => 2024-08-28
            [newDate] => 2024-08-27
        )

    [2] => Array
        (
            [id] => 90409
            [oldDate] => 2024-08-21
            [newDate] => 2024-08-22
        )

    [3] => Array
        (
            [id] => 90409
            [oldDate] => 2024-08-22
            [newDate] => 2024-08-23
        )
)

Пытаюсь сделать так, чтоб удалились все промежуточные движения элемента, остались только начальное и конечное, и удалились элементы массива, где элемент вернули в исходное положение (0 и 1 элементы массива). В конечном итоге обработанный массив должен выглядеть так:
Измененный массив
Array
(
    [0] => Array
        (
            [id] => 90409
            [oldDate] => 2024-08-21
            [newDate] => 2024-08-23
        )
)

Есть предположение, что нужно пройтись по всем элементам массива с одинаковым ID и работать уже по ним.
Если кратко сформулировать вопросы, то:
1) Как понять, что у элемента newDate последняя, и удалить все остальные элементы, оставив 2 значения
2) Как удалить только элементы с противоположными oldDate и newDate, оставив при этом другие с одинаковым ID
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
@WeStlik Автор вопроса
Нашлось такое решение данного вопроса:
spoiler
$moves = [
    ['id' => 90415, 'oldDate' => '2024-08-27', 'newDate' => '2024-08-28'],
    ['id' => 90415, 'oldDate' => '2024-08-28', 'newDate' => '2024-08-27'],
    ['id' => 90409, 'oldDate' => '2024-08-21', 'newDate' => '2024-08-22'],
    ['id' => 90409, 'oldDate' => '2024-08-22', 'newDate' => '2024-08-23'],
    ];

$data = [];
foreach($moves as $move)
{
    $id = $move['id'];
    if(isset($data[$id]))
    {
        // Если уже установлен такой ID, меняем значение newDate
        $data[$id]['newDate'] = $move['newDate'];
    }
    else
    {
        // Новый ID, заполняем элемент
        $data[$id] = $move;
    }
}

// Сохраняем значения только с разными значениям oldDate и newDate
$result = array_filter($data, fn($move) => $move['oldDate'] != $move['newDate']);

// Удаление ключей массива
$result = array_values($result);

var_export($result);

Результат:
array (
  0 => 
  array (
    'id' => 90409,
    'oldDate' => '2024-08-21',
    'newDate' => '2024-08-23',
  ),
)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы