【问题标题】:Find the Non-Repeating Elements in an Array查找数组中的非重复元素
【发布时间】:2017-08-18 07:59:02
【问题描述】:

我的数组是:

$array= array(4,3,4,3,1,2,1);

我想像下面这样输出它:

Output = 2 

(因为 2 只出现一次)

这是我尝试过的:

$array = array(4, 3, 4, 3, 1, 2, 1);
$array1 = array(4, 3, 4, 3, 1, 2, 1);
$array_diff = array_diff($array, $array1); 

【问题讨论】:

    标签: php arrays filtering unique


    【解决方案1】:

    你可以这样做:计算每个元素的出现次数,然后过滤掉大于 1 的出现次数。

    $array = [4, 3, 4, 3, 1, 2, 1];
    foreach ($array as $v)
    {
        $arr[$v][] = 1;  // doesn't matter if 1 is set to a different value
    }
    foreach($arr as $k => $v)
    {
        if (count($v) == 1) {
            $o[] = $k;
        }
    }    
    print_r($o);
    

    结果:

    Array
    (
        [0] => 2
    )
    

    【讨论】:

      【解决方案2】:

      *阅读本文的最后一节,了解避免边缘情况问题的最稳定技术——它也是最冗长的。

      单行无循环:(Demo)

      var_export(array_keys(array_intersect(array_count_values($array),[1])));
      

      细分:

      array_keys(                          // return the remaining keys from array_count_values 
          array_intersect(                 // filter the first array by second
              array_count_values($array),  // count number of occurrences of each value
              [1]                          // identify the number of occurrences to keep
          )
      )
      

      如果您(或任何未来的读者)想要保留更多值,请替换 array_intersect() 中的第二个参数/数组。 例如: 您想保留 1、2 和 3:array(1,2,3)[1,2,3]

      附言作为记录,您可以使用 array_filter() 和自定义函数来省略所有非 1 的计数值,但我使用了 array_intersect(),因为语法更简洁且 IMO 更易于阅读。


      附言以为我会重新审视并包含 PHP7.4 技术并与其他基于函数的技术进行比较...

      代码:(Demo)

      $numbers = [4, 3, 4, 3, 1, 2, 1];
      var_export(
          array_keys(
              array_intersect(
                  array_count_values($numbers),
                  [1]
              )
          )
      );
      
      echo "\n---\n";
      var_export(
          array_keys(
              array_filter(
                  array_count_values($numbers),
                  function($count) {
                      return $count === 1;
                  }
              )
          )
      );
      
      echo "\n---\n";
      // PHP7.4+
      var_export(
          array_keys(
              array_filter(
                  array_count_values($numbers),
                  fn($count) => $count === 1
              )
          )
      );
      

      *对于具有不保证为整数的值的类似任务,array_count_values() 将报错“警告:array_count_values(): Can only count string and integer values”。
      即使像@LF00's answer这样使用值作为第一级键的经典循环也会由于浮点数和数值被自动转换为整数而遭受潜在的副作用。

      这意味着更通用的解决方案是:(Demo)

      $result = [];
      foreach ($array as $index => $value) {
          foreach ($array as $i => $v) {
              if ($value === $v && $index !== $i) {
                  continue 2; // duplicate found, stop checking this value; do not retain
              }
          }
          $result[] = $value;
      }
      var_export($result);
      

      【讨论】:

        【解决方案3】:

        您可以使用array_count_values() php 函数。

        例如:

        $numbers = [4, 3, 4, 3, 1, 2, 1];
        
        // build count array as key = number and value = count
        $counter_numbers = array_count_values($numbers);
        
        print_r($counter_numbers);
        

        输出:

        Array
        (
            [4] => 2
            [3] => 2
            [1] => 2
            [2] => 1
        )
        

        然后循环遍历新数组以获取非重复值:

        $unique_numbers = [];
        
        foreach ($counter_numbers as $number => $count) {
            if ($count === 1) {
                $unique_numbers[] = $number;
            }
        }
        
        print_r($unique_numbers);
        

        输出:

        Array
        (
            [0] => 2
        )
        

        【讨论】:

          【解决方案4】:

          如果在您的场景中只有一个可以使用的唯一值:

          $array= array(4,3,4,3,1,2,1);
          $singleValue = array_search(1, array_count_values($array));
          var_dump($singleValue) // Outputs: 2
          

          【讨论】:

          • 此答案将不允许返回多个唯一值,这更有可能是 OP 和此页面的未来访问者所寻求的。研究人员将期望一组不重复的值——这个 sn-p 生成一个值。
          猜你喜欢
          • 1970-01-01
          • 2011-06-06
          • 1970-01-01
          • 2018-07-02
          • 2020-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-04
          相关资源
          最近更新 更多