Get the keys for duplicate values in an array

前端 未结 9 1421
温柔的废话
温柔的废话 2020-11-28 11:11

I have the following array:

$myarray = Array(\"2011-06-21\", \"2011-06-22\", \"2011-06-22\", \"2011-06-23\", \"2011-06-23\", \"2011-06-24\", \"2011-06-24\",         


        
9条回答
  •  有刺的猬
    2020-11-28 11:29

    $array = array(
        '2011-06-21','2011-06-22','2011-06-22','2011-06-23',
        '2011-06-23','2011-06-24','2011-06-24','2011-06-25',
        '2011-06-25','2011-06-26','2011-06-26','2011-06-27',
        '2011-06-27','2011-06-28','2011-06-29','2011-06-29',
        '2011-06-30','2011-06-30','2011-07-01','2011-07-01',
        '2011-07-02','2011-07-02','2011-07-03','2011-07-03',
        '2011-07-04','2011-07-04','2011-07-05','2011-07-05',
        '2011-07-06','2011-07-06','2011-07-07','2011-07-07',
    );
    
    function getDupKeys(array $array, $return_first = true, $return_by_key = true) {
        $seen = array();
        $dups = array();
    
        foreach ($array as $k => $v) {
            $vk = $return_by_key ? $v : 0;
            if (!array_key_exists($v, $seen)) {
                $seen[$v] = $k;
                continue;
            }
            if ($return_first && !array_key_exists($v, $dups)) {
                $dups[$vk][] = $seen[$v];
            }
            $dups[$vk][] = $k;
        }
        return $return_by_key ? $dups : $dups[0];
    }
    

    If both optional parameters are true, it returns an array of arrays; the key of each child array will be the value which was not unique, and the values of the array will be all those keys which had that value.

    If the first optional parameter is false, then only keys after the first instance of a non-unique value will be returned (i.e., for the given array, each value returns only one key, the second time it occurred, instead of the first).

    If the second parameter is optional, then instead of returning an array of arrays, it returns a flat array containing all duplicate keys (exactly which keys it returns are dictated by the prior optional parameter).

    Here's a dumpprint_r, cause it's prettier:

    print_r(getDupKeys($array));
    
    Array
    (
        [2011-06-22] => Array
            (
                [0] => 1
                [1] => 2
            )
    
        [2011-06-23] => Array
            (
                [0] => 3
                [1] => 4
            )
    
        [2011-06-24] => Array
            (
                [0] => 5
                [1] => 6
            )
    
        [2011-06-25] => Array
            (
                [0] => 7
                [1] => 8
            )
    
        [2011-06-26] => Array
            (
                [0] => 9
                [1] => 10
            )
    
        [2011-06-27] => Array
            (
                [0] => 11
                [1] => 12
            )
    
        [2011-06-29] => Array
            (
                [0] => 14
                [1] => 15
            )
    
        [2011-06-30] => Array
            (
                [0] => 16
                [1] => 17
            )
    
        [2011-07-01] => Array
            (
                [0] => 18
                [1] => 19
            )
    
        [2011-07-02] => Array
            (
                [0] => 20
                [1] => 21
            )
    
        [2011-07-03] => Array
            (
                [0] => 22
                [1] => 23
            )
    
        [2011-07-04] => Array
            (
                [0] => 24
                [1] => 25
            )
    
        [2011-07-05] => Array
            (
                [0] => 26
                [1] => 27
            )
    
        [2011-07-06] => Array
            (
                [0] => 28
                [1] => 29
            )
    
        [2011-07-07] => Array
            (
                [0] => 30
                [1] => 31
            )
    
    )
    

    print_r(getDupKeys($array, false));
    
    Array
    (
        [2011-06-22] => Array
            (
                [0] => 2
            )
    
        [2011-06-23] => Array
            (
                [0] => 4
            )
    
        [2011-06-24] => Array
            (
                [0] => 6
            )
    
        [2011-06-25] => Array
            (
                [0] => 8
            )
    
        [2011-06-26] => Array
            (
                [0] => 10
            )
    
        [2011-06-27] => Array
            (
                [0] => 12
            )
    
        [2011-06-29] => Array
            (
                [0] => 15
            )
    
        [2011-06-30] => Array
            (
                [0] => 17
            )
    
        [2011-07-01] => Array
            (
                [0] => 19
            )
    
        [2011-07-02] => Array
            (
                [0] => 21
            )
    
        [2011-07-03] => Array
            (
                [0] => 23
            )
    
        [2011-07-04] => Array
            (
                [0] => 25
            )
    
        [2011-07-05] => Array
            (
                [0] => 27
            )
    
        [2011-07-06] => Array
            (
                [0] => 29
            )
    
        [2011-07-07] => Array
            (
                [0] => 31
            )
    
    )
    

    print_r(getDupKeys($array, true, false));
    
    Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
        [3] => 4
        [4] => 5
        [5] => 6
        [6] => 7
        [7] => 8
        [8] => 9
        [9] => 10
        [10] => 11
        [11] => 12
        [12] => 14
        [13] => 15
        [14] => 16
        [15] => 17
        [16] => 18
        [17] => 19
        [18] => 20
        [19] => 21
        [20] => 22
        [21] => 23
        [22] => 24
        [23] => 25
        [24] => 26
        [25] => 27
        [26] => 28
        [27] => 29
        [28] => 30
        [29] => 31
    )
    

    print_r(getDupKeys($array, false, false));
    
    Array
    (
        [0] => 2
        [1] => 4
        [2] => 6
        [3] => 8
        [4] => 10
        [5] => 12
        [6] => 15
        [7] => 17
        [8] => 19
        [9] => 21
        [10] => 23
        [11] => 25
        [12] => 27
        [13] => 29
        [14] => 31
    )
    

提交回复
热议问题