2016-06-13 4 views
2

J'ai besoin de votre aide. J'ai fait diverses recherches et aucune méthode de test n'a fonctionné avec 3 niveaux ou plus. Je dois partir que les seules valeurs de celles dans le tableau multidimensionnel ..Supprimer les valeurs en double d'un tableau multidimensionnel (3 + niveaux) avec PHP

See this example

Mon tableau:

 
Array 
(
    [sucesso] => Array 
     (
      [LAUDO_VISTORIA] => Array 
       (
        [0] => 0027 
        [2] => 30027 
        [3] => 0027 
       ) 
      [LAUDO] => Array 
       (
        [0] => 0027 
        [2] => 30027 
        [3] => 0027 
       ) 
      [DADOS_DO_VEICULO] => Array 
       (
        [0] => 0027 
        [1] => 30027 
       ) 
     ) 
    [code] => 201 
)
+3

Parcourez votre baie. Utilisez 'array_unique'. – jszobody

+0

@jszobody aussi? Comment vais-je monter le nouveau? –

Répondre

2

S'il vous plaît noter que si vous avez des chiffres avec zéro, vous devez les stocker en tant que chaînes, sinon ils seront interprétés comme des nombres octaux. Vous pouvez utiliser (int) pour obtenir le type de cast correct, lorsque vous les éditez.

Le premier code ci-dessous aplatissent le tableau par l'utilisation de serialize comme rappel dans array_map, les doublons sont supprimées à l'aide array_unique, puis remettre ensemble à l'aide array_intersect_key, le processus est mis en boucle pour arriver à des niveaux plus profonds du tableau.

Le deuxième code ci-dessous suit la même logique mais array_unique est uniquement exécuté au niveau le plus profond de chaque chemin de clé de réseau. Une instruction if/else a été ajoutée, car tous les chemins de clé de tableau n'ont pas la même longueur/profondeur. (Si quelqu'un sait d'une meilleure façon de le faire, s'il vous plaît faites le moi savoir.)

serialize peut être remplacé par json_encode, mais je ne suis pas sûr de ce qui est plus rapide.

Je ne suis pas très bon pour expliquer comment les choses fonctionnent, s'il vous plaît n'hésitez pas à modifier, si vous pouvez reformuler ce que j'ai dit ci-dessus mieux.

Pour supprimer les doublons dans les tableaux multidimensionnels, à la fois les sous-matrices et les éléments dupliqués.

function multi_unique($array){ 
     $temp = array_intersect_key($array, array_unique(array_map("serialize", $array))); 
     foreach ($temp as $key => $value){ 
      if (is_array($value)){ 
       $temp[$key] = multi_unique($value); 
      } 
     } 
     return $temp; 
    } 

Pour supprimer les éléments en double du sous-tableau de l'extrémité la plus profonde de chaque chemin de clé.

function multi_unique($array){ 
     $temp = array_intersect_key($array, array_map("serialize", $array)); 
     foreach ($temp as $key => $value){ 
      if (is_array($value)){ 
       $temp[$key] = multi_unique($value); 
      } 
//the else if statement is to counter the problem where the deepest level of each path is different 
      else if (count($temp) == count($temp, COUNT_RECURSIVE)){ 
       $temp=array_unique($temp); 
      } 
     } 
     return $temp; 
    } 
+0

Ce ne sera pas toujours un nombre peut être une chaîne –

+0

Mon code fonctionne pour les nombres et les chaînes. Ce que je disais, si vous voulez stocker des nombres tels que '0123', '0104', vous devez les stocker comme des chaînes pas de nombre, d'où les apostrophe/guillemets, sinon ils seront traités comme des nombres octaux,(octal) sera traduit par 84 (déc). – SML

+0

Si vous utilisez un zéro, le nombre est interprété par PHP comme un nombre octal. Vous pouvez le google – SML