2009-12-07 14 views
15

No estoy seguro de si esta pregunta es un duplicado que necesita ser eliminado, pero no pude encontrar la respuesta en otro lugar, así que voy a intentarlo.matriz multi-dimensional php eliminar duplicado

Tengo una matriz 2D que se ve de la siguiente manera:

Array 
(
[0] => Array 
    (
     [0] => dave 
     [1] => jones 
     [2] => [email protected] 
    ) 

[1] => Array 
    (
     [0] => john 
     [1] => jones 
     [2] => [email protected] 

    ) 

[2] => Array 
    (
     [0] => bruce 
     [1] => finkle 
     [2] => [email protected] 
    ) 
) 

me gustaría eliminar aquellos con correos electrónicos duplicados. En el ejemplo anterior, me gustaría simplemente eliminar [] [0] o [] [2]. No estoy preocupado por verificar contra nombres ni nada de eso, solo necesito que las matrices secundarias se deduplican en base a un solo valor.

En el momento en que tienen algo como esto

if(is_array($array) && count($array)>0){ 
    foreach ($array as $subarray) { 
    $duplicateEmail[$subarray[2]] = isset($duplicateEmail[$subarray[2]]); 
    unset($duplicateEmail[$subarray[2]]); 
    } 
    } 

pero simplemente no es correcto. Cualquier ayuda apreciada.

+0

posible duplicado de [Cómo eliminar valores duplicados de una matriz multi-dimensional en PHP] (http://stackoverflow.com/questions/307674/how-to-remove-duplicate-values-from-a -multi-dimensional-array-in-php) –

Respuesta

25

Una solución rápida que utiliza la singularidad de los índices de matriz:

$newArr = array(); 
foreach ($array as $val) { 
    $newArr[$val[2]] = $val;  
} 
$array = array_values($newArr); 

Aviso 1: Como es visible desde arriba, el último partido para una dirección de correo electrónico se utiliza en lugar de la primera. Esto se puede cambiar mediante la sustitución de la segunda línea con

foreach (array_reverse($array) as $val) { 

Aviso 2: Los índices de la matriz resultante se mezclan un poco hacia arriba. Pero supongo que esto no importa ...

+0

su 'para' debería haber sido un 'foreach' pero de lo contrario, funciona bien, gracias. –

+0

tienes toda la razón, he cambiado esto. Gracias –

+0

@Cassy - Acabo de convertir esto en una función para mí en una pequeña aplicación que estoy codificando, ¡gracias por ello! – Shackrock

7

Los comentarios de los usuarios para array_unique() tienen algunas soluciones para esto. Por ejemplo

function multi_unique($array) { 
     foreach ($array as $k=>$na) 
      $new[$k] = serialize($na); 
     $uniq = array_unique($new); 
     foreach($uniq as $k=>$ser) 
      $new1[$k] = unserialize($ser); 
     return ($new1); 
    }

de http://uk.php.net/manual/en/function.array-unique.php#57202.

+3

que cubre toda la sub-matriz en lugar de valores individuales si no me equivoco –

+0

+1 para la solución a la tarea compleja – YsoL8

1
$array = array(
    array('dave','jones','[email protected]'), 
    array('dave','jones','[email protected]'), 
    array('dave','jones','[email protected]'), 
    array('dave','jones','[email protected]'), 
    array('dave','jones','[email protected]') 
); 

$copy = $array; // create copy to delete dups from 
$usedEmails = array(); // used emails 

for($i=0; $i<count($array); $i++) { 

    if (in_array($array[$i][2], $usedEmails)) { 
     unset($copy[$i]); 
    } 
    else { 
     $usedEmails[] = $array[$i][2]; 
    } 

} 

print_r($copy); 
12

Solución mucho más simple.

$unique = array_map('unserialize', array_unique(array_map('serialize', $array))); 

echo "<pre>"; 
print_r($unique); 
+0

Eso no responde la pregunta. Eso solo busca matrices únicas en lugar de sus propiedades. Aunque te agradezco que le des otra oportunidad. –

+0

Buen trabajo Dipesh –

+0

@RishabhSeth me alegro de que te ayude –

0

Mi propuesta:

protected function arrayUnique($array, $preserveKeys = false) 
{ 
    $uniqueArray = array(); 
    $hashes = array(); 

    foreach ($array as $key => $value) { 
     if (true === is_array($value)) { 
      $uniqueArray[$key] = $this->arrayUnique($value, $preserveKeys); 

     } else { 
      $hash = md5($value); 

      if (false === isset($hashes[$hash])) { 
       if ($preserveKeys) { 
        $uniqueArray[$key] = $value; 
       } else { 
        $uniqueArray[] = $value; 
       } 

       $hashes[$hash] = $hash; 
      } 
     } 
    } 

    return $uniqueArray; 
} 
0

SORT_REGULAR usuario como segundo parámetro.

$uniqueArray = array_unique($array, SORT_REGULAR); 
Cuestiones relacionadas