有一个元素“移动”的数组,大致相同,只是可以多很多倍:
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
)
)
我怎样才能做到这一点,以便包含大量元素的数组不会使脚本延迟很长时间
这是一个使用中间
$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',
),
)