Agregue valores duplicados de una matriz php a otra y mantenga las mismas claves

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.

preguntado el 03 de mayo de 12 a las 14:05

¿Qué pasa si hay más de un valor duplicado? -

Tengo más de un valor duplicado, quiero mantenerlos (con la clave correspondiente), porque necesito estos valores... -

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. -

5 Respuestas

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

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

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

$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

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 or haz tu propia pregunta.