PHP-如果任何数组值匹配,则删除所有数组值


PHP - If any array values match then remove all of them

我有点拘泥于我认为必须有一个非常简单的解决方案。

假设我有一个数组:

$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;}));