2013-06-07 1 views
1

Si quelqu'un pouvait m'aider s'il vous plaît ici, je serais éternellement reconnaissant que j'ai passé environ 2 jours complets maintenant à essayer de faire fonctionner cela. Je veux prendre deux tableaux multidimensionnels et les comparer, puis supprimer des enregistrements en double. Le scénario est le suivant: Les valeurs de array2 ont déjà été affectées au profil d'un utilisateur. Les valeurs de array1 sont TOUTES les valeurs disponibles parmi lesquelles l'utilisateur peut choisir. Je veux comparer la fonction à deux de sorte que seuls ceux qui ne sont pas déjà attribués sont donnés en option (à gauche dans le tableau) ...PHP Multidimensional Arrays - Enlever des doublons

$array1 = array(
    [0] => array([id] => 3 [name] => Eye Colour) 
    [1] => array([id] => 1 [name] => Hair Colour) 
    [2] => array([id] => 5 [name] => Hair Length) 
    [3] => array([id] => 4 [name] => Height) 
); 

$array2 = array(
    [0] => array([attribute_id] => 3 [name] => Eye Colour [active] => 1) 
    [1] => array([attribute_id] => 5 [name] => Hair Length [active] => 1)) 
); 

de array_diff() de PHP ne fonctionne pas avec des tableaux multidimensionnels, et je J'ai fait une bonne recherche mais je n'arrive pas à trouver quelque chose qui fonctionne pour moi!

Le résultat basé sur les deux tableaux ci-dessus doivent être:

$array1 = array(
    [0] => array([id] => 1 [name] => Hair Colour) 
    [1] => array([id] => 4 [name] => Height) 
); 

Le champ [actif] est hors de propos, donc je juste besoin de comparer l'ID et les champs Nom. Je me rends compte que le nom des deux champs d'identification est différent, mais ce serait une douleur de les changer car ce sont des noms de colonnes de bases de données.

Il doit supprimer complètement le tableau, pas seulement les valeurs. J'ai eu des problèmes avec des tentatives précédentes où il laisse array() là-dedans et puis cela provoque des problèmes lorsque je suis en boucle dans le tableau en générant les champs que l'utilisateur peut choisir.

Aidez-nous s'il vous plaît. Je vais t'acheter beaucoup de bières! :)

Merci, Steve

Répondre

2

Je ne sais pas comment le faire avec une fonction PHP intégré, mais voici un personnalisé:

$array1 = array(
    array('id' => 3, 'name' => 'Eye Colour'), 
    array('id' => 1, 'name' => 'Hair Colour'), 
    array('id' => 5, 'name' => 'Hair Length'), 
    array('id' => 4, 'name' => 'Height'), 
); 

$array2 = array(
    array('attribute_id' => 3, 'name' => 'Eye Colour', 'active' => 1), 
    array('attribute_id' => 5, 'name' => 'Hair Length', 'active' => 1) 
); 

// function to remove duplicates 
function myArrayDiff($array1, $array2) { 
    // loop through each item on the first array 
    foreach ($array1 as $key => $row) { 
     // loop through array 2 and compare 
     foreach ($array2 as $key2 => $row2) { 
      if ($row['id'] == $row2['attribute_id']) { 
       // if we found a match unset and break out of the loop 
       unset($array1[$key]); 
       break; 
      } 
     } 
    } 

    return array_values($array1); 
} 

$array3 = myArrayDiff($array1, $array2); 

print_r($array3); 

/* result: 
    Array 
    (
     [0] => Array 
      (
       [id] => 1 
       [name] => Hair Colour 
      ) 

     [1] => Array 
      (
       [id] => 4 
       [name] => Height 
      ) 

    ) 
*/ 
+0

Salut Chris, je vous remercie beaucoup pour prendre le temps d'écrire ceci - cela fonctionne parfaitement et est exactement ce dont j'avais besoin. Je ne suis pas sûr s'il y a une façon plus efficace de le faire? Je suis juste conscient que ça va faire du vélo à travers $ array2 plusieurs fois, ce qui pourrait être un peu décalé quand il y a une grande base d'utilisateurs. Pourtant, je suis très reconnaissant pour votre temps et votre expertise. Merci beaucoup, Steve – SigmaSteve

+0

Merci! Son 1h ici et des milliers de lignes de code plus tard, votre solution est la seule qui fait réellement ce qu'il est censé faire et avoir de bons commentaires! –