$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];
}
Si ambos parámetros opcionales son verdaderas, devuelve una matriz de matrices; la clave de cada matriz secundaria será el valor que no sea único, y los valores de la matriz serán todas aquellas claves que tengan ese valor.
Si el primer parámetro opcional es falso, solo las claves después de se devolverá la primera instancia de un valor no único (es decir, para la matriz dada, cada valor devuelve solo una clave, la segunda vez que ocurrió , en lugar de la primera).
Si el segundo parámetro es opcional, en lugar de devolver una matriz de matrices, devuelve una matriz plana que contiene todas las claves duplicadas (exactamente qué claves devuelve están dictadas por el parámetro opcional anterior).
Aquí está un print_r volcado, porque es más bonita:
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
)
que podría acortar la ruta de código cuando '$ limpia === true' poniendo' if ($ limpia === true) {return array_unique ($ my_arr); } 'en la parte superior;) – Dereleased
cierto que gracias :) – Trey
Por cierto, el método más rápido que he probado hasta ahora, maneja 100 iteraciones de una matriz de más de 100.000 elementos en aproximadamente 0.04463 segundos por iteración! – Dereleased