$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];
}
Если оба необязательных параметра имеют значение true, возвращается массив массивов; ключом каждого дочернего массива будет значение, которое не было уникальным, а значениями массива будут все те ключи, которые имели это значение.
Если первый необязательный параметр имеет значение false, то только ключи после будут возвращены первый экземпляр неуникального значения (т. Е. Для данного массива каждое значение возвращает только один ключ, второй время это произошло, а не первое).
Если второй параметр является необязательным, то вместо возврата массива массивов он возвращает плоский массив, содержащий все дублирующиеся ключи (какие именно ключи он возвращает, продиктовано предыдущим необязательным параметром).
Вот dump print_r, потому что он красивее:
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
)