我有点拘泥于我认为必须有一个非常简单的解决方案。
假设我有一个数组:
$A = array(1, 1, 2, 4, 6, 7, 7, 7, 13);
我怎么可能删除多次出现的所有值?
所以我留下了一个数组,看起来像这个
$A = array(2, 4, 6, 13);
我尝试过使用数组unique,但这只会删除重复项,只留下一个值。我需要使用以下逻辑:如果有任何匹配的值,那么删除所有匹配的值。
您可以尝试这样的方法。
$A = array(1, 1, 2, 4, 6, 7, 7, 7, 13);
$A = array_count_values($A);
foreach($A as $key => $value) {
if($value > 1)
unset($A[$key]);
}
$A = array_keys($A);
print_r($A);
编辑:修复错误
Array
(
[0] => 2
[1] => 4
[2] => 6
[3] => 13
)
您可以使用带有自定义回调的array_filter()
来过滤重复多次的数组值:
function removeDuplicates($array) {
$values = array_count_values($array);
return array_filter($array, function($item) use ($values) {
return $values[$item] === 1;
});
}
用法:
$A = array(1, 1, 2, 4, 6, 7, 7, 7, 13);
print_r( removeDuplicates($A) );
输出:
Array
(
[2] => 2
[3] => 4
[4] => 6
[8] => 13
)
演示
您可以通过一些编码来实现这一点。
首先看这篇SO文章,使用array_unique:获得所有重复项的列表
php只返回数组中的重复条目
然后,您必须循环浏览从上面的链接返回的重复项,并执行array_search以返回值的索引,然后执行array_splice以实际删除它。
我不知道有什么代码可以一步到位。
试试这个(使用PHP>=5.3):
$A = array_keys(array_filter(
array_count_values($A),
function ($count)
{
return $count == 1;
}
));
解释:
array_count_values返回一个数组,使用数组的值作为键,并使用它们在数组中的频率作为值。
array_filter对数组中的每个值进行迭代,将它们传递给回调函数(在本例中为匿名函数)。如果频率为1,则将数组中的当前值返回到结果数组中。
array_keys返回数组中的键,在本例中为频率等于1的值。
因此,压缩的"单行"形式是:
$A=array_keys(array_filter(array_count_values($A),function($c){return $c==1;}));