【问题标题】:php return only duplicated entries from an arrayphp 只返回数组中重复的条目
【发布时间】:2010-11-18 13:36:24
【问题描述】:

我想从一个数组中检索所有重复的条目。这在 PHP 中可行吗?

array(
    1 => '1233',
    2 => '12334',
    3 => 'Hello',
    4 => 'hello',
    5 => 'U'
);

我想返回一个只有重复值的数组:“hello”。

所需的输出数组:

array(
    1 => 'Hello',
    2 => 'hello'
);

【问题讨论】:

标签: php arrays


【解决方案1】:
function get_duplicates ($array) {
    return array_unique( array_diff_assoc( $array, array_unique( $array ) ) );
}

【讨论】:

    【解决方案2】:
    <?php
    function array_not_unique($raw_array) {
        $dupes = array();
        natcasesort($raw_array);
        reset($raw_array);
    
        $old_key   = NULL;
        $old_value = NULL;
        foreach ($raw_array as $key => $value) {
            if ($value === NULL) { continue; }
            if (strcasecmp($old_value, $value) === 0) {
                $dupes[$old_key] = $old_value;
                $dupes[$key]     = $value;
            }
            $old_value = $value;
            $old_key   = $key;
        }
        return $dupes;
    }
    
    $raw_array    = array();
    $raw_array[1] = 'abc@xyz.com';
    $raw_array[2] = 'def@xyz.com';
    $raw_array[3] = 'ghi@xyz.com';
    $raw_array[4] = 'abc@xyz.com'; // Duplicate
    
    $common_stuff = array_not_unique($raw_array);
    var_dump($common_stuff);
    

    【讨论】:

    • 如果我们之前使用array_map("serialize", $arr);,二维数组也是不错的解决方案。谢谢!
    【解决方案3】:

    您需要使您的函数不区分大小写才能获得您正在寻找的“Hello”=>“hello”结果,试试这个方法:

    $arr = array(1=>'1233',2=>'12334',3 =>'Hello' ,4=>'hello', 5=>'U');
    
    // Convert every value to uppercase, and remove duplicate values
    $withoutDuplicates = array_unique(array_map("strtoupper", $arr));
    
    // The difference in the original array, and the $withoutDuplicates array
    // will be the duplicate values
    $duplicates = array_diff($arr, $withoutDuplicates);
    print_r($duplicates);
    

    输出是:

    Array
    (
    [3] => Hello
    [4] => hello
    )
    

    @AlixAxel 编辑:

    这个答案非常具有误导性。它仅在这种特定条件下有效。这个反例:

    $arr = array(1=>'1233',2=>'12334',3 =>'Hello' ,4=>'HELLO', 5=>'U');
    

    Fails miserably。此外,这不是保留重复项的方法:

    array_diff($arr, array_unique($arr));
    

    由于其中一个重复值将在array_unique 中,然后被array_diff 截断。

    @RyanDay 编辑:

    因此,请查看@Srikanth 或@Bucabay 的答案,它们适用于所有情况(在 Bucabay 中查找不区分大小写),而不仅仅是问题中指定的测试数据。

    【讨论】:

    • 非常干净和不错的方法。向其中添加一些 cmets,以便新手 PHP 编码人员可以理解:可以使用该语言编写一些简洁的代码,并且应该知道 :-)
    • 顺便说一句,如果数组很长,我建议有一个使用 SPL 的迭代器模式来节省内存的示例。
    • @rday - 注意你的测试对象包含数字和一个大写的“U”,就 strtoupper() 而言,它们都是大写的。返回的结果是 strtoupper() 修改的混合大小写值,而不是重复值。如果发布者需要两个骗子,那么约翰提出的解决方案将非常有效地完成这项工作,时间复杂度为 O(n),我认为这是最好的情况。
    • -1,这完全失败了:codepad.org/7NQ9lQLU。仅凭机会发挥作用。
    • 浪费了我 15 分钟的时间来查看 @AkshatSinghal 的评论
    【解决方案4】:

    这是正确的做法(区分大小写):

    array_intersect($arr, array_unique(array_diff_key($arr, array_unique($arr))));
    

    还有一个不区分大小写的解决方案:

    $iArr = array_map('strtolower', $arr);
    $iArr = array_intersect($iArr, array_unique(array_diff_key($iArr, array_unique($iArr))));
    
    array_intersect_key($arr, $iArr);
    

    但是@Srikanth 的回答效率更高(实际上,除了这个之外,它是唯一正常工作的)。

    【讨论】:

    • 好的,我会咬的。我的解决方案有错误,但您的解决方案没有给出 OP 正在寻找的返回值。我不明白我的答案是多么糟糕的失败,而你的更好?
    • @ryanday:我的工作是以区分大小写的方式完成的,并且可以调整为不区分大小写。另一方面,您的答案几乎与return array(1 =&gt;'Hello' ,2=&gt;'hello'); 一样有用。我希望你明白我的意思......
    • @ryanday:添加了不区分大小写的版本。
    【解决方案5】:

    试试:

    $arr2 = array_diff_key($arr, array_unique($arr));
    

    不区分大小写:

    array_diff_key($arr, array_unique(array_map('strtolower', $arr)));
    

    【讨论】:

    • -1,其中一个重复值将被删除,不会返回所有重复值。
    【解决方案6】:
    function array_not_unique($raw_array) {
        $dupes = array();
        natcasesort($raw_array);
        reset($raw_array);
    
        $old_key   = NULL;
        $old_value = NULL;
        foreach ($raw_array as $key => $value) {
            if ($value === NULL) { continue; }
            if (strcasecmp($old_value, $value) === 0) {
                $dupes[$old_key] = $old_value;
                $dupes[$key]     = $value;
            }
            $old_value = $value;
            $old_key   = $key;
        } return $dupes;
    }
    

    Srikanth (john) 添加的内容,但比较不区分大小写。

    【讨论】:

      【解决方案7】:

      12 岁的帖子,接受的答案返回一个空白数组,其他的很长。

      这是我对未来 Google 员工的看法,简短并返回所有重复索引(索引?)。

      $myArray = array('fantastic', 'brilliant', 'happy', 'fantastic', 'Happy', 'wow', 'battlefield2042 :(');
      
      function findAllDuplicates(array $array)
      {
          // Remove this line if you do not need case sensitive.
          $array = array_map('strtolower', $array);
      
          // Remove ALL duplicates
          $removedDuplicates = array_diff($array, array_diff_assoc($array, array_unique($array)));
      
          return array_keys(array_diff($array, $removedDuplicates));
          // Output all keys with duplicates
          // array(4) {
          //   [0]=>int(0)
          //   [1]=>int(2)
          //   [2]=>int(3)
          //   [3]=>int(4)
          // }
      
      
          return array_diff($array, $removedDuplicates);
          // Output all duplicates
          // array(4) {
          //   [0]=>string(9) "fantastic"
          //   [2]=>string(5) "happy"
          //   [3]=>string(9) "fantastic"
          //   [4]=>string(5) "happy"
          // }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-04
        • 2011-12-02
        • 1970-01-01
        • 1970-01-01
        • 2015-06-28
        • 1970-01-01
        相关资源
        最近更新 更多