2013-12-09 44 views
1

我有点卡在这里,我认为必须有一个相当简单的解决方案。PHP - 如果任何数组值匹配,然后删除所有这些

说我有一个数组:

$A = array(1, 1, 2, 4, 6, 7, 7, 7, 13); 

我怎么可能删除所有出现不止一次的价值观?

所以我留下了一个数组,看起来像这样

$A = array(2, 4, 6, 13); 

我试着使用数组独一无二的,但只是删除重复让你有一个值。我需要使用以下逻辑:如果有任何匹配的值 - 则删除所有匹配的值。

+0

你一直想? – qwertynl

+1

是的,这正是我要去的,是否有任何内置的PHP函数可以做到这一点? –

+0

供参考:我注意到我的答案下面有一个错字。现在已修好。 – RichardW11

回答

2

你总是可以尝试这样的事情。

$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 
) 
+0

简单通常更好,在这种情况下,RichardW11的答案是Amal的array_filter()版本的两倍。 – Dave

0

你可以用编码的升技做到这一点。

首先看到这个SO发布使用array_unique获得所有副本的列表:

php return only duplicated entries from an array

那么你必须依次通过重复从上面的链接返回,做一个array_search返回值的索引,然后array_splice实际删除它。

我不知道任何代码将在一个步骤中为您执行此操作。

2

可以使用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 
) 

Demo.

0

尝试这样(PHP> = 5.3):

$A = array_keys(array_filter(
    array_count_values($A), 
    function ($count) 
    { 
     return $count == 1; 
    } 
)); 

说明:

array_count_values使用数组的值作为密钥和它们在阵列值频率返回一个数组。

array_filter迭代数组中的每个值,将数组传递给回调函数(本例中为anonymous function)。如果频率为1,则数组中的当前值将返回到结果数组中。

array_keys返回数组中的键,在这种情况下,频率等于1的值。

因此,压缩“单行”的形式是:

$A=array_keys(array_filter(array_count_values($A),function($c){return $c==1;})); 
相关问题