2010-10-14 6 views

Respuesta

12

Se puede utilizar una combinación de array_unique, array_diff_assoc y array_diff:

array_diff($arr, array_diff_assoc($arr, array_unique($arr))) 
+2

¡Qué solución tan extrañamente simple! –

+1

Tenga en cuenta que, aunque esta podría ser una solución concisa, todas las funciones están utilizando Quicksort internamente que está en O (n²) en el peor de los casos (O (n · log n) en el caso promedio). Entonces la complejidad total está en O (n²) en el peor de los casos también. – Gumbo

4

Usted puede utilizar

$singleOccurences = array_keys(
    array_filter(
     array_count_values(
      array('banana', 'mango', 'banana', 'mango', 'apple') 
     ), 
     function($val) { 
      return $val === 1; 
     } 
    ) 
) 

Ver

  • array_count_values - Cuenta todos los valores de una matriz
  • array_filter - Filtros elementos de una matriz mediante una función de devolución de llamada
  • array_keys - devolver todas las llaves o un subconjunto de las claves de una matriz
  • callbacks
+0

ahora eso tiene sentido, aún así, me gusta más la mía ^^ – Hannes

+2

@Hannes No, esto es elegante :) – jensgram

-1

PHP.net http://php.net/manual/en/function.array-unique.php

array array_unique (array $array [, int $sort_flags = SORT_STRING ])

Toma una matriz de entrada y devuelve una nueva matriz sin valores duplicados.


Nueva solución:


function remove_dupes(array $array){ 
    $ret_array = array(); 
    foreach($array as $key => $val){ 
     if(count(array_keys($val) > 1){ 
      continue; 
     } else { 
      $ret_array[$key] = $val; 
     } 
} 
+1

-1 lea el ejemplo en la pregunta; 'array_unique' no funciona. – meagar

+1

Elimina los duplicados, lo que hace que la matriz contenga solo valores únicos. Sin embargo, OP quiere eliminar * todas las instancias de cualquier valor duplicado, es decir, retener solo los valores que se representan * exactamente * una vez. – jensgram

+0

No entiendo lo que quieres decir. deberia de funcionar. EDITAR: oh, así. –

1

Si sólo desea dejar los valores en el array que ya son únicos, en lugar de seleccionar una instancia única de cada valor, que de hecho se tiene que tirar tu propio. La funcionalidad integrada está ahí para desinfectar conjuntos de valores, en lugar de filtrar.

1

¿Desea eliminar las entradas que tienen duplicados, de modo que solo le quedan las entradas que eran únicas en la lista? Hmm suena como algo que necesitarás para hacer tu propio.

1

No hay una función existente; Vas a tener que hacer esto en dos pases, uno para contar los valores únicos y uno para extraer los valores únicos:

$count = array(); 
foreach ($values as $value) { 
    if (array_key_exists($value, $count)) 
    ++$count[$value]; 
    else 
    $count[$value] = 1; 
} 

$unique = array(); 
foreach ($count as $value => $count) { 
    if ($count == 1) 
    $unique[] = $value; 
} 
2

Sólo tiene que escribir su propio simple bucle foreach:

$used = array();  
$array = array("banna","banna","mango","mango","apple"); 

foreach($array as $arrayKey => $arrayValue){ 
    if(isset($used[$arrayValue])){ 
     unset($array[$used[$arrayValue]]); 
     unset($array[$arrayKey]); 
    } 
    $used[$arrayValue] = $arrayKey; 
} 
var_dump($array); // array(1) { [4]=> string(5) "apple" } 

divertirse:)

+1

Por alguna razón no pensé que pudiera cambiar el tamaño de una matriz de esa manera durante un 'foreach', pero parece funcionar. – meagar

+0

¿Hay alguna razón por la que no declaró '$ used = array()' antes del bucle 'foreach'? –

+1

@Kendall Hopkins no es necesario, pero está en el buen espíritu de los estándares de codificación, lo agregaré :) – Hannes

0

La respuesta en la parte superior se ve genial, pero en una nota al margen: si alguna vez quiere eliminar los duplicados pero deja el primero, usar array_flip dos veces sería una forma bastante simple de hacerlo.array_flip (array_flip (x))

+0

tienes 'array_unique' para eso –

0

sólo parcialmente relevante para esta pregunta específica - pero creé esta función de la respuesta de Gumbo para las matrices multidimensionales: estados

function get_default($array) 
{ 
    $default = array_column($array, 'default', 'id'); 
    $array = array_diff($default, array_diff_assoc($default, array_unique($default))); 

    return key($array); 
} 

En este ejemplo, había en caché y cada uno distinto del predeterminado era 0 (el valor predeterminado era 1). Indexo la matriz default de las ID, y luego la convierto en una cadena. Entonces, para ser claros, el resultado devuelto de esto es el ID del estado predeterminado siempre que esté en la misma parte de la matriz multidimensional y no en la clave

Cuestiones relacionadas