Agregue valores duplicados de una matriz php a otra y mantenga las mismas claves
Frecuentes
Visto 2,812 veces
0
Tengo un PHP Array, y quiero extraer de él los valores duplicados y conservar las claves correspondientes para cada valor, en un nuevo Array.
Esta es mi matriz inicial
Array
(
[0] => ABC123-A
[1] => BG231-B
[2] => ABC123-A
[3] => BG231-E
[4] => BG231-F
[5] => BG231-G
[6] => BG231-H
[7] => ABC123-A
[8] => BG231-J
[9] => BG231-K
[10] => ABC123-A
)
Y esto es lo que quiero tener:
Array
(
[0] => ABC123-A
[2] => ABC123-A
[7] => ABC123-A
[10] => ABC123-A
)
Cómo puedo hacer eso ?
Gracias por ayudar.
5 Respuestas
1
Prueba esto:
$return = array_unique($array);
var_dump(
array_diff($array, array_diff($return, array_diff_assoc($array, $return)))
);
contestado el 04 de mayo de 12 a las 01:05
1
PHP no tiene una función incorporada que haga esto, pero puede combinar array_count_values
y array_intersect
para obtener la(s) matriz(es) que desea.
El primero se usa para saber qué valores existen en su matriz (y los cuenta para que sea fácil filtrar todos los que no están duplicados), y la segunda función conserva las claves. Si conoce el valor duplicado por adelantado, solo necesita usar este último:
$duplicatesArray = array_intersect($array, array($duplicate));
Ejemplo completo:
/**
* @param array $array
* @param int $threshold (optional) minimum number of elements per group
* @return array
*/
function array_group_by_value(array $array, $threshold = 1)
{
$grouped = array();
foreach(array_count_values($array) as $value => $count)
{
if ($count < $threshold) continue;
$grouped[$value] = array_intersect($array, array($value));
}
return $grouped;
}
Ejemplo de uso:
$test = array('a', 'b', 'a', 'a', 'b', 'c');
var_dump(array_group_by_value($test, 2));
Salida:
array(2) {
["a"]=>
array(3) {
[0]=>
string(1) "a"
[2]=>
string(1) "a"
[3]=>
string(1) "a"
}
["b"]=>
array(2) {
[1]=>
string(1) "b"
[4]=>
string(1) "b"
}
}
contestado el 03 de mayo de 12 a las 14:05
1
Si necesita todos los duplicados en una matriz, puede intentar:
$unique = array_unique($array); //get unique values
$diff = array_diff_assoc($array, $unique); //get duplicates
$intersect = array_intersect($unique, $diff); //get unique values with duplicates
return $intersect+$diff; //join unique with duplicates and duplicates
contestado el 03 de mayo de 12 a las 15:05
0
$duplicated=null;
foreach($yourarray as $k => $v){
foreach($yourarray as $k2 => $v2){
if($v == $v2 && $k2 != $k){
$duplicated[$k]=$v;
}
}
}
contestado el 03 de mayo de 12 a las 14:05
No creo que recomiende esta respuesta (en comparación con otras respuestas) porque siempre está haciendo n x n Comprobaciones condicionales con el bucle anidado. Quiero decir, se logra el mismo resultado con menos iteraciones implementando un break
. 3v4l.org/Doo0R Admito que no he pensado demasiado en esta tarea, pero array_count_values()
se siente como una forma directa de identificar duplicados sin volver a buscar la matriz de entrada una y otra vez. - mickmackusa
-1
Puede usar el array_unique()
.http://php.net/manual/en/function.array-unique.php
contestado el 03 de mayo de 12 a las 14:05
A juzgar por la pregunta, esto es lo contrario. OP está pidiendo MANTENER los duplicados, no eliminarlos: Danneth
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas php arrays or haz tu propia pregunta.
¿Qué pasa si hay más de un valor duplicado? - hakre
Tengo más de un valor duplicado, quiero mantenerlos (con la clave correspondiente), porque necesito estos valores... - Ahmed Ala Dali
Esta respuesta obtenga todos los valores duplicados: cada valor duplicado tiene su propia matriz y está clave por el valor. Cada matriz contiene las claves originales. - hakre