
在处理包含时间序列数据的数组时,我们经常会遇到同一个日期出现多条记录的情况。例如,一个订单数据数组可能包含多个相同order_date的子数组,而我们的目标是仅保留每个order_date对应的最后一条记录。这意味着,如果某个日期多次出现,所有较早的记录都应被移除,只留下最新(在原始数组中位置靠后)的那条。
考虑以下订单数据示例:
$arr = array(
array('order_id' => '12652', 'order_date' => '21-01', 'total' => 6.7, 'cumulative' => 6.7),
array('order_id' => 5204, 'order_date' => '21-02', 'total' => 21.65, 'cumulative' => 28.35), // 较早的'21-02'
array('order_id' => 7270, 'order_date' => '21-02', 'total' => 10.98, 'cumulative' => 39.33), // 较晚的'21-02',应保留
array('order_id' => 0, 'order_date' => '21-03', 'total' => 0, 'cumulative' => 39.33),
array('order_id' => 196331, 'order_date' => '21-04', 'total' => 12.6, 'cumulative' => 51.93), // 较早的'21-04'
array('order_id' => 199875, 'order_date' => '21-04', 'total' => 14.75, 'cumulative' => 66.68), // 较晚的'21-04',应保留
array('order_id' => 0, 'order_date' => '21-05', 'total' => 0, 'cumulative' => 66.68),
// ... 其他日期记录
'total' => 66.68,
'orders' => 5,
'avg' => 13.336,
);根据上述规则,我们希望移除索引为 1 和 4 的子数组,因为它们的 order_date (21-02 和 21-04) 在后面有重复且更晚的记录。
为了实现“保留最后一条记录”的需求,我们可以采用一种逆向处理的策略。核心思路如下:
这种方法巧妙地利用了array_reverse()和array_filter()的组合,配合一个静态变量来高效地完成任务。
立即学习“PHP免费学习笔记(深入)”;
以下是实现上述逻辑的PHP代码:
<?php
$arr = array(
array(
'order_id' => '12652',
'order_date' => '21-01',
'total' => 6.7,
'cumulative' => 6.7
),
array(
'order_id' => 5204,
'order_date' => '21-02',
'total' => 21.65,
'cumulative' => 28.35
),
array(
'order_id' => 7270,
'order_date' => '21-02',
'total' => 10.98,
'cumulative' => 39.33,
),
array(
'order_id' => 0,
'order_date' => '21-03',
'total' => 0,
'cumulative' => 39.33
),
array(
'order_id' => 196331,
'order_date' => '21-04',
'total' => 12.6,
'cumulative' => 51.93
),
array(
'order_id' => 199875,
'order_date' => '21-04',
'total' => 14.75,
'cumulative' => 66.68
),
array(
'order_id' => 0,
'order_date' => '21-05',
'total' => 0,
'cumulative' => 66.68
),
array(
'order_id' => 0,
'order_date' => '21-06',
'total' => 0,
'cumulative' => 66.68
),
array(
'order_id' => 0,
'order_date' => '21-07',
'total' => 0,
'cumulative' => 66.68
),
array(
'order_id' => 0,
'order_date' => '21-08',
'total' => 0,
'cumulative' => 66.68
),
array(
'order_id' => 0,
'order_date' => '21-09',
'total' => 0,
'cumulative' => 66.68
),
'total' => 66.68,
'orders' => 5,
'avg' => 13.336,
);
echo "<h3>原始数组:</h3>";
echo "<pre>";
print_r($arr);
echo "</pre>";
$res = array_filter(array_reverse($arr, true), function ($item) {
// 声明一个静态变量来存储已经处理过的日期
static $existentKeys = [];
// 检查当前元素是否是包含 'order_date' 的子数组
if (isset($item['order_date'])) {
$order_date = $item['order_date'];
// 如果该日期已经存在于 $existentKeys 中,说明这不是该日期的最后一条记录(因为我们是反向遍历)
if (isset($existentKeys[$order_date])) {
return false; // 过滤掉此元素
} else {
// 否则,这是该日期的第一条记录(反向遍历时),将其标记为已存在并保留
$existentKeys[$order_date] = true;
return true; // 保留此元素
}
}
// 对于不包含 'order_date' 键的元素(如 'total', 'orders', 'avg'),直接保留
return true;
});
// 再次反转数组以恢复原始顺序
$final_result = array_reverse($res, true);
echo "<h3>处理后的数组 (保留每个日期的最后一条记录):</h3>";
echo "<pre>";
print_r($final_result);
echo "</pre>";
?>通过结合 array_reverse() 和 array_filter(),并利用静态变量在回调函数中维护状态,我们可以优雅且高效地解决PHP数组中按特定字段去重并保留最后一条记录的问题。这种模式在处理日志、订单或任何时间序列数据时都非常有用,能够帮助我们获得最新、最准确的数据视图。理解 static 变量在回调函数中的作用是掌握此解决方案的关键。
以上就是PHP数组去重:基于日期保留最后一条记录的策略与实现的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号