我需要从输入数组中删除特定列中出现重复值的行。
样品阵列:
$array = [
['user_id' => 82, 'ac_type' => 1],
['user_id' => 80, 'ac_type' => 5],
['user_id' => 76, 'ac_type' => 1],
['user_id' => 82, 'ac_type' => 1],
['user_id' => 80, 'ac_type' => 5]
];
我想按user_id
进行筛选,以确保唯一性并实现以下结果:
所以,我的输出将是这样的:
[
['user_id' => 82, 'ac_type' => 1],
['user_id' => 80, 'ac_type' => 5],
['user_id' => 76, 'ac_type' => 1]
]
我已经试过了:
$result = array_unique($array, SORT_REGULAR);
和
$result = array_map("unserialize", array_unique(array_map("serialize", $array)));
和
$result = array();
foreach ($array as $k => $v) {
$results[implode($v)] = $v;
}
$results = array_values($results);
print_r($results);
但仍存在重复行。
4条答案
按热度按时间hmmo2u0o1#
为了获得更清晰的“最小、完整、可验证的示例”,我将在演示中使用以下输入数组:
1.无条件地将行推入结果数组,并分配关联的第一级键,然后使用
array_values()
重新建立索引。这种方法会用以后出现的行覆盖以前重复的行。array_column demo:
foreach demo:
输出量:
1.使用条件或null合并指派运算子,在移除重复项目时保留第一个出现的数据列。
foreach null coalescing assignment demo:
foreach isset demo:
输出量:
1.也可以无条件推送数据并避免条件,但输入和输出之间的行顺序可能不同(如果这对您很重要)。
array_reverse, array_column demo:
array_reduce demo:
foreach array_reverse demo:
输出量:
有关此示例中未表示的边缘情况的警告:如果您使用行值作为标识符,而这些行值在用作键时可能会被破坏,那么上述技术将给予不可靠的结果。例如,PHP不允许浮点值作为键(它们将导致错误或被截断,这取决于您的PHP版本)。只有在这些边缘情况下,您才可能考虑使用低效的、迭代的
in_array()
调用来评估唯一性。使用
array_unique(..., SORT_REGULAR)
仅适用于按整行数据确定唯一性的情况。array_unique demo:
输出量:
作为要求的一个小扩展,如果必须基于多个列而不是所有列来确定唯一性,则使用由有意义的列值组成的“组合键”。下面使用空合并赋值运算符,但也可以实现#2和#3中的其他技术。
代码:(Demo)
rks48beu2#
结果:
vsnjm48y3#
花了我一段时间,但这应该工作(解释在评论):
功能是从这个问题的答案:Get the keys for duplicate values in an array
输出:
xwmevbvl4#
测试和工作示例。
将输出:
从此处http://php.net/manual/en/function.array-unique.php获取用户贡献的注解。