2011-07-07 5 views
1

J'ai un tableau multidimensionnel retourné par PDO après une requête et j'ai quelques résultats en double. Ils ne sont pas entièrement dupliqués, mais seulement une clé est en double. Donc:Déduplication d'un tableau multidimensionnel

[0] => 
    'id' => 2, 
    'test' => 'My test', 
[1] => 
    'id' => 2, 
    'test' => 'Another test', 
[2] => 
    'id' => 3, 
    'test' => 'My tests', 

Je souhaite supprimer les entrées en double ayant la même valeur d'ID. Comment puis-je faire ceci?

+0

Ma première pensée est de marcher sur chaque élément de ce tableau et d'avoir un second tableau qui contiendrait les identifiants "visités". Si vous rencontrez un identifiant, qui est déjà visité, vous le supprimez(). – koressak

+1

@JavascriptGOLD, pourquoi avez-vous des doublons dans votre base de données ?? si c'est un ** 'id' **, il ne devrait pas être autorisé à être dupliqué ... – Neal

+0

Ça vient d'un INNER JOIN, mec. Ce ne sont pas des ID en double, chaque enregistrement est différent, mais les mêmes ID apparaissent à partir de chaque enregistrement. Comme une liste de commentaires et d'utilisateurs. – JavascriptGOD

Répondre

0

Vous pouvez créer un nouveau tableau avec les AOP résultats ...

 
$newArray = array(); 
foreach ($pdoArray AS $result) { 
    if (isset($newArray[$result['id']])) { 
     continue; } 
    $newArray[$result['id']] = $result['test']; 
} 

Qu'est-ce que cela ne s'ajoute des choses à un nouveau tableau, avec l'identifiant bing clé du nouveau tableau. S'il trouve un tableau avec la même clé, il le saute simplement.

C'est une réponse simple, vous auriez probablement envie des contrôles pour vous assurer que vous obtenez la bonne valeur (qui des deux ID vous voulez garder?)

Sinon, si vous ne voulez pas garder l'un d'entre eux, construire le tableau, mais en plus de faire un continue; vous pouvez ajouter l'ID à un nouveau tableau (un tableau de suppression). Puis, une fois la première boucle se fait, boucle à travers le tableau de suppression et supprimez les clés:

 
$newArray = array(); 
$delete = array(); 
foreach ($pdoArray AS $result) { 
    if (isset($newArray[$result['id']])) { 
     $delete[] = $result['id']; 
     continue; } 
    $newArray[$result['id']] = $result['test']; 
} 
foreach ($delete AS $del) { 
    unset($newArray[$del]); } 

OU vous pouvez ajouter l'ID à la clé des réseaux de suppression (plutôt que la valeur), puis faire une array_diff_key(). Mais, il me semble que vous avez besoin de repenser la structure de votre base de données ... pourquoi avez-vous des ID en double?

1

tableau récursif unique pour multiarrays

<?php 
function super_unique($array) 
{ 
    $result = array_map("unserialize", array_unique(array_map("serialize", $array))); 

    foreach ($result as $key => $value) 
    { 
    if (is_array($value)) 
    { 
     $result[$key] = super_unique($value); 
    } 
    } 

    return $result; 
} 
?> 
+0

référence: http://php.net/manual/fr/fonction.array-unique.php – diEcho

0

Changer votre requête à utiliser GROUP BY id

Mais en général, si elle est un id, il ne devrait pas être autorisé à être en double.