【问题标题】:PHP - If any array values match then remove all of themPHP - 如果任何数组值匹配,则将它们全部删除
【发布时间】:2013-12-09 20:01:26
【问题描述】:

我有点卡在我认为必须有一个非常简单的解决方案上。

假设我有一个数组:

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

我怎么可能删除所有多次出现的值?

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

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

我尝试过使用唯一的数组,但这只会删除重复项,从而为您留下一个值。我需要使用以下逻辑:如果有任何匹配的值 - 然后删除所有匹配的值。

【问题讨论】:

  • 你一直在尝试什么?
  • 是的,这正是我想要的,有没有内置的 PHP 函数可以做到这一点?
  • 仅供参考:我注意到我在下面的回答有错字。现在已修复。

标签: php arrays


【解决方案1】:

你总是可以尝试这样的。

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

【讨论】:

  • 简单通常更好,在这种情况下,RichardW11 的答案是 Amal 的 array_filter() 版本的两倍。
【解决方案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.

【讨论】:

    【解决方案3】:

    你可以通过一些编码来做到这一点。

    首先查看这篇 SO 帖子以使用 array_unique 获取所有重复项的列表:

    php return only duplicated entries from an array

    然后,您必须遍历从上面链接返回的重复项,并执行 array_search 以返回值的索引,然后 array_splice 以实际删除它。

    我不知道有什么代码可以一步完成。

    【讨论】:

      【解决方案4】:

      试试这个(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;}));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        • 2016-05-25
        • 2021-11-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多