Comment faire pour supprimer les valeurs en double à partir d'un tableau multidimensionnel en PHP
Comment puis-je supprimer les valeurs en double à partir d'un tableau multidimensionnel en PHP?
Exemple de tableau:
Array
(
[0] => Array
(
[0] => abc
[1] => def
)
[1] => Array
(
[0] => ghi
[1] => jkl
)
[2] => Array
(
[0] => mno
[1] => pql
)
[3] => Array
(
[0] => abc
[1] => def
)
[4] => Array
(
[0] => ghi
[1] => jkl
)
[5] => Array
(
[0] => mno
[1] => pql
)
)
Vous devez vous connecter pour publier un commentaire.
Voici une autre manière. Pas de variables intermédiaires sont enregistrées.
Nous avons utilisé cette de dupliquer les résultats à partir d'une variété de chevauchement des requêtes.
serialize
etunserialize
. La façon dont PHP a mis en œuvre ces a changé derrière les scènes à quelques reprises. Pour le plus long temps de références n'a pas été stocké. Ils sont maintenant, mais seulement pour les références dans le tableau sérialisé. (Je sais que la question n'est pas d'avoir des objets). La meilleure façon seraitarray_unique($input, SORT_REGULAR)
ou certaines fonction personnalisée.serialize(array('a' => '1', 'b' => '1'))
est différente deserialize(array('b' => '1', 'a' => '1'))
. Cette option échoue pour les tableaux utilisés commesets
ou(hash)maps
.$input = array_map('unserialize', array_unique(array_map('serialize', $input)));
Depuis 5.2.9 vous pouvez utiliser
array_unique()
si vous utilisez leSORT_REGULAR
drapeau de la sorte:Ce qui rend la fonction de comparer les éléments pour l'égalité, comme si
$a == $b
ont été utilisés, ce qui est parfait pour votre cas.Sortie
Gardez à l'esprit, cependant, que la documentation états:
array(1, 2)
est différente dearray(2, 1)
. Ceci ne fonctionnera pas pour les tableaux utilisés commesets
.in_array
ou vous vous assurez que vos éléments sont utilisables comme matrice de touches (serializable) et de l'utilisation de certains mannequin tableau de la valeur. Cela dépend de votre mise en œuvre. Pour la première mise en œuvre, vous ne pouvez pas aller avec cette approche.J'ai eu un problème similaire mais j'ai trouvé un 100% solution de travail pour elle.
D'une autre manière. Préserver les touches ainsi.
Les commentaires de l'utilisateur sur le array_unique() de la documentation ont de nombreuses solutions pour cela. Voici l'un d'eux:
C'est à partir de http://ca3.php.net/manual/en/function.array-unique.php#57202.
Si "supprimer les doublons" signifie "supprimer les doublons, mais qu'une personne", il y a une solution pourrait être d'appliquer le
array_unique(...)
sur la "colonne d'identification" en premier, puis à supprimer dans le tableau d'origine toutes les clés, qui ont été retirés de la colonne de tableau:Le résultat est:
Cela permettra d'éliminer les doublons de noms de la matrice. unique par clé
Suffit d'utiliser SORT_REGULAR option comme deuxième paramètre.
si vous avez besoin d'éliminer les doublons sur des touches spécifiques, comme un mysqli id, voici une technique simple d'une fonction
Points De Bonus
Vous pouvez passer un tableau de clés et ajouter un externe foreach, mais il sera 2x plus lent par clé supplémentaire.
si vous avez un tableau comme ceci:
(les utilisateurs est le nom de la table)
et que vous souhaitez supprimer les doublons...puis:
peut être une solution 😛
Un facile de lire la solution, probablement pas le plus efficace:
Beaucoup de personne m'ont demandé comment faire pour la rendre Unique tableau multidimensionnel. J'ai pris la référence de votre commentaire et il m'aide.
Tout d'abord, Merci à @jeromegamez @daveilers pour votre solution. Mais à chaque fois j'ai donné la réponse, ils m'ont demandé comment cette "sérialiser" et " unserialize œuvres. C'est pourquoi je veux partager la raison de cela avec vous, de sorte qu'il permettra d'aider plus de gens à comprendre le concept derrière cela.
Je vais expliquer pourquoi nous utilisons des "sérialiser" et "unserialize" dans les étapes de :
Étape 1: Convertir le tableau multidimensionnel pour tableau à une dimension
Pour convertir le tableau multidimensionnel à un tableau à une dimension, d'abord générer des flux d'octets de la représentation de tous les éléments (y compris les tableaux imbriqués) à l'intérieur de la matrice. serialize() la fonction peut générer des flux d'octets de la représentation d'une valeur. Pour générer des flux d'octets de la représentation de tous les éléments, l'appel de la fonction serialize() la fonction à l'intérieur de array_map() comme une fonction de rappel. Le résultat sera un tableau unidimensionnel n'importe comment beaucoup de niveaux, le tableau multidimensionnel a.
Etape 2: valeurs uniques
Pour faire de cette dimension tableau unique, l'utilisation array_unique() fonction.
Étape 3: Revenir au tableau multidimensionnel
Si le tableau est désormais unique, les valeurs ressemble flux d'octets de la représentation. Pour revenir en arrière au tableau multidimensionnel, utilisez unserialize() fonction.
Merci encore pour tout cela.
Très facile et logique pour Unique multi dimension de la matrice est comme suit,
Si vous avez array comme ceci:
utilisation
foreach
pour résoudre ce problème:il vous donnera le résultat suivant:
et si vous voulez réorganiser l'ordre des clés,
Cette opération va vous donner organisé valeurs clés comme ceci:
J'espère que cela va effacer tout.
Une alternative pour sérialiser et unique
*/
Si vous avez un tableau comme ceci
et vous souhaitez obtenir des tableaux comme ceci:
ou
un code suivant peut aider à
J'ai donné ce problème de beaucoup de pensée et ont déterminé que la solution optimale doit suivre deux règles.
Avec cela à l'esprit, et compte tenu de l'ensemble de PHP bizarreries, ci-dessous est la solution que j'ai trouvé. Contrairement à certains des autres réponses, il a la capacité de supprimer des éléments basés sur ce qui les touche(s) que vous souhaitez. Le tableau d'entrée est prévu pour être les touches numériques.
Le seul inconvénient est que les touches ne sont pas dans l'ordre lors de l'itération se termine. Ce n'est pas un problème si vous êtes par la suite en utilisant uniquement les boucles foreach, mais si vous avez besoin d'utiliser une boucle for, vous pouvez mettre
$input = array_values($input);
après, à renuméroter les touches.Que les gens disent
array_unique()
est très lent, voici un extrait de code que j'utilise pour un niveau de tableau multidimensionnel.Référence de l'utilisateur contribué note de
array_unique()
la fonction de la page en php.net$output = array_map('unserialize', array_keys($result));