2010-10-14 4 views

Répondre

12

Vous pouvez utiliser une combinaison de array_unique, array_diff_assoc et array_diff:

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

Quelle solution bizarrement simple. –

+1

Notez que bien que cela puisse être une solution concise, toutes les fonctions utilisent Quicksort en interne qui est en O (n²) dans le pire des cas (O (n · log n) en moyenne). Donc la complexité totale est en O (n²) dans le pire des cas aussi. – Gumbo

4

Vous pouvez utiliser

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

Voir

+0

maintenant que cela a du sens, encore, j'aime le mien plus ^^ – Hannes

+2

@Hannes je ne - c'est élégant :) – jensgram

-1

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

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

Prend un tableau d'entrée et retourne un nouveau tableau sans valeurs en double.


Nouvelle solution:


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 lire l'exemple dans la question; 'array_unique' ne fonctionne pas. – meagar

+1

Supprime les doublons, rendant ainsi le tableau contenant uniquement des valeurs uniques. OP, cependant, veut que toutes les occurrences de toute valeur dupliquée soient supprimées, c'est-à-dire ne conservent que les valeurs qui sont représentées * exactement * une fois. – jensgram

+0

Je ne comprends pas ce que vous voulez dire. ça devrait marcher. EDIT: oh, comme ça. –

1

Si vous voulez laisser que des valeurs dans le tableau qui sont déjà uniques, plutôt que de sélectionner une instance unique de chaque valeur, vous aura en effet à rouler le tien. Fonctionnalité intégrée est juste là pour assainir les ensembles de valeurs, plutôt que de filtrer.

1

Vous voulez supprimer les entrées qui ont des doublons, de sorte qu'il ne vous reste plus que les entrées qui étaient uniques dans la liste? Hmm ça ressemble à quelque chose dont vous aurez besoin pour rouler le vôtre.

1

Il n'existe aucune fonction existante; Vous devrez le faire en deux passes, l'un pour compter les valeurs uniques et un pour extraire les valeurs uniques:

$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

Il suffit d'écrire votre propre boucle foreach simple:

$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" } 

have fun:)

+1

Pour une raison quelconque, je ne pensais pas que vous pouviez changer la taille d'un tableau de cette façon lors d'un 'foreach', mais cela semble fonctionner. – meagar

+0

Y at-il une raison pour laquelle vous n'avez pas déclaré '$ used = array()' avant la boucle 'foreach'? –

+1

@Kendall Hopkins il n'est pas nécessaire, mais vous avez raison dans l'esprit de bonnes normes de codage je vais l'ajouter :) – Hannes

0

La réponse au top est belle, mais d'un autre côté: si vous voulez supprimer les doublons mais laisser le premier, utiliser array_flip deux fois serait un moyen très simple de le faire.array_flip (array_flip (x))

+0

vous avez 'array_unique' pour ça –

0

seulement partiellement pertinente à cette question spécifique - mais j'ai créé cette fonction de la réponse de Gumbo pour les tableaux multidimensionnels:

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

    return key($array); 
} 

Dans cet exemple, j'avais mises en cache des statuts et chacun autre que la valeur par défaut était 0 (la valeur par défaut était 1). J'indexe le tableau default à partir des ID, puis le transforme en une chaîne. Donc, pour être clair - le résultat retourné de ceci est l'ID de l'état par défaut fournissant il est dans la même partie du tableau multidimensionnel et non la clé de

Questions connexes