
在处理包含多条记录的数组时,我们经常会遇到需要根据某个特定字段(例如日期、id等)进行去重的情况。更进一步,有时我们不仅要去除重复项,还要确保保留的是该重复项的“最新”或“最后出现”的实例。例如,在一个订单数据数组中,如果同一日期出现了多笔订单,我们可能只想保留该日期的最后一笔记录。
直接对数组进行去重通常会保留第一个遇到的实例。要保留最后一个实例,我们需要一种巧妙的方法来逆向处理数据流。PHP的array_reverse()和array_filter()函数组合使用,可以优雅地解决这一问题。
该解决方案的核心思想是:
假设我们有以下订单数据数组:
$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 "原始数组:\n";
print_r($arr);
$res = array_filter(array_reverse($arr), function ($item) {
static $existentKeys = []; // 使用静态变量记录已处理的日期
// 初始化 order_date 变量,以处理非数组项或缺少 'order_date' 的项
$order_date = null;
// 检查当前项是否为有效的订单数据(是一个数组且包含 'order_date' 键)
if (is_array($item) && isset($item['order_date'])) {
$order_date = $item['order_date'];
}
// 如果 order_date 已被提取(说明是有效的订单数据项)
if ($order_date !== null) {
// 如果该日期已在 existentKeys 中,说明在反转数组中已经处理过它的最后一个实例,
// 因此当前项是重复的较早实例,应被过滤掉。
if (isset($existentKeys[$order_date])) {
return false; // 过滤掉
} else {
// 如果该日期未在 existentKeys 中,说明这是它在反转数组中的第一次出现,
// 也就是原始数组中的最后一个实例,应被保留。
$existentKeys[$order_date] = true; // 记录该日期已被处理
return true; // 保留
}
}
// 对于非订单数据项(如 'total', 'orders', 'avg')或缺少 'order_date' 的项,直接保留
return true;
});
// 再次反转数组,恢复原始顺序
$final_result = array_reverse($res);
echo "\n处理后的数组 (保留重复日期的最后实例):\n";
print_r($final_result);代码解析:
立即学习“PHP免费学习笔记(深入)”;
通过巧妙地结合array_reverse()和array_filter()函数,我们能够高效地处理PHP数组中的重复数据,并根据指定键值保留每个重复项的最后(最新)实例。这种方法简洁、易懂且功能强大,适用于多种数据清洗和预处理场景,是PHP开发者工具箱中的一个实用技巧。
以上就是PHP数组去重:根据指定键值保留最后一条记录的策略与实现的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号