将更改历史记录的二维数组减少为每个 id 的初始值和最终值,并删除没有更改的行

问题描述 投票:0回答:1

有一个元素“移动”的数组,大致相同,只是可以多很多倍:

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
        )
)

我怎样才能做到这一点,以便包含大量元素的数组不会使脚本延迟很长时间

php arrays multidimensional-array filtering grouping
1个回答
2
投票

这是一个使用中间

$data
关联数组的解决方案,它允许高效的查找:

$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 already present, update its newDate
        $data[$id]['newDate'] = $move['newDate'];
    }
    else
    {
        // New id, store it
        $data[$id] = $move;
    }
}

// Keep ids with different oldDate and newDate
$result = array_filter($data, fn($move) => $move['oldDate'] != $move['newDate']);

// Remove array keys
$result = array_values($result);

var_export($result);

输出:

array (
  0 => 
  array (
    'id' => 90409,
    'oldDate' => '2024-08-21',
    'newDate' => '2024-08-23',
  ),
)
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.