valores - php devuelve solo entradas duplicadas de una matriz
php eliminar elementos duplicados array (6)
Esta es la forma correcta de hacerlo (distingue entre mayúsculas y minúsculas):
array_intersect($arr, array_unique(array_diff_key($arr, array_unique($arr))));
Y una solución que no distingue entre mayúsculas y minúsculas:
$iArr = array_map(''strtolower'', $arr);
$iArr = array_intersect($iArr, array_unique(array_diff_key($iArr, array_unique($iArr))));
array_intersect_key($arr, $iArr);
Pero la respuesta de @Srikanth es más eficiente (en realidad, es la única que funciona correctamente además de esta).
Quiero recuperar todas las entradas duplicadas de una matriz. ¿Es esto posible en PHP?
array(
1 => ''1233'',
2 => ''12334'',
3 => ''Hello'',
4 => ''hello'',
5 => ''U''
);
Quiero devolver una matriz con solo el valor duplicado: "hola".
Matriz de salida deseada:
array(
1 => ''Hello'',
2 => ''hello''
);
Necesitará hacer que su función sea insensible a las mayúsculas para obtener el resultado "Hola" => "hola" que está buscando, pruebe este método:
$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);
La salida es:
Array
(
[3] => Hello
[4] => hello
)
Editado por @AlixAxel:
Esta respuesta es muy engañosa. Sólo funciona en esta condición específica. Este contra-ejemplo:
$arr = array(1=>''1233'',2=>''12334'',3 =>''Hello'' ,4=>''HELLO'', 5=>''U'');
Falla miserablemente . Además, esta no es la manera de mantener duplicados:
array_diff($arr, array_unique($arr));
Dado que uno de los valores duplicados estará en array_unique
, y luego se eliminará por array_diff
.
Editar por @RyanDay:
Así que mire la respuesta de @Srikanth o @ Bucabay, que funciona para todos los casos (busque los que no distinguen mayúsculas y minúsculas en los de Bucabay), no solo los datos de prueba especificados en la pregunta.
Tratar:
$arr2 = array_diff_key($arr, array_unique($arr));
caso insensible:
array_diff_key($arr, array_unique(array_map(''strtolower'', $arr)));
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;
}
Lo que Srikanth (John) agregó pero con la comparación insensible al caso.
function get_duplicates ($array) {
return array_unique( array_diff_assoc( $array, array_unique( $array ) ) );
}
<?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] = ''[email protected]'';
$raw_array[2] = ''[email protected]'';
$raw_array[3] = ''[email protected]'';
$raw_array[4] = ''[email protected]''; // Duplicate
$common_stuff = array_not_unique($raw_array);
var_dump($common_stuff);