IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

array unique sur tableau 2 dimensions


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Points : 105
    Points
    105
    Par défaut array unique sur tableau 2 dimensions
    Bonjour

    J'ai par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $t_temp[1]['a'] = "coucou";
    $t_temp[1]['b'] = "salut";
     
    $t_temp[2]['a'] = "coucou ça va?";
    $t_temp[2]['b'] = "salut ça va?";
     
    $t_temp[3]['a'] = "coucou";
    $t_temp[3]['b'] = "salut";
    Et bien j'aimerai faire un array_unique dessus pour n'obtenir plus que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $t_temp[1]['a'] = "coucou";
    $t_temp[1]['b'] = "salut";
     
    $t_temp[2]['a'] = "coucou ça va?";
    $t_temp[2]['b'] = "salut ça va?";
    C'est-à-dire qu'il dédoublonne les tableaux qui possède une valeur identique.

    Mais je n'arrive pas quand le tableau est a 2 dimensions comme içi.

    merci

  2. #2
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Points : 2 399
    Points
    2 399
    Par défaut
    Dans la doc de array_unique :
    Note: Notez que array_unique() n'est pas conçu pour fonctionner avec des tableaux multidimensionnels.
    Après, je sais pas si il existe une autre fonction pour les tables multidimensionnels :/

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Points : 105
    Points
    105
    Par défaut
    Ah mince je n'avais pas vu.

    Je ne suis pas sûr qu'il existe une fonction mais avec 2 boucles for imbriqué ça ne peut pas se faire?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Hello,

    La méthode la plus simple est de sérialiser les sous tableaux.

    Par ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $tab1 = array_map( 'serialize' , $monTableau );
    $tab1 = array_unique( $tab1 );
    $monTableau = array_map( 'unserialize' , $tab1 );

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Points : 105
    Points
    105
    Par défaut
    merci mais je n'arrive pas à faire le lien avec ton exemple et ma situation

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    serialiser un tableau le transforme en une chaine de caractère (grosso modo). Le code de Petibidon transforme tous les sous-tableaux en chaines, applique array_unique sur ce tableau (ce qui est maintenant possible vu qu'il ne contient plus que des chaines), puis déserialise le tout pour récupérer les sous-tableaux.
    On pourrait l'écrire sous forme de fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function array_unique_recursive($tableau)
    {
    $tab1 = array_map( 'serialize' , $tableau);
    $tab1 = array_unique( $tab1 );
    $tableau= array_map( 'unserialize' , $tab1 );
    return $tableau;
    }

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Points : 105
    Points
    105
    Par défaut
    merci ça fonctionne, cependant je me suis rendu compte que dans mon cas il fallait que toutes les colonnes ne sont pas identiques mais seulement certaines.

    par exemple j'ai :

    $t_temp[1]['a'] = "a1";
    $t_temp[1]['b'] = "a2";

    $t_temp[2]['a'] = "b1";
    $t_temp[2]['b'] = "b2";

    $t_temp[3]['a'] = "a1";
    $t_temp[3]['b'] = "c2";
    et bien il faudrait que ça donne :

    $t_temp[1]['a'] = "a1";
    $t_temp[1]['b'] = "a2";

    $t_temp[2]['a'] = "b1";
    $t_temp[2]['b'] = "b2";
    car a1 est présente dans t_temp[3].

    Sauf qu'avec array_unique je ne peux pas dans ma situation.

  8. #8
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Points : 105
    Points
    105
    Par défaut
    Je reste toujours sur mon problème.

    Je pense que c'est peut-être faisable avec 2boucles for imbriquées du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $nb = count($tab);
     
    for($i=0;$i<$nb;$i++) {
    	for($j=0;$j<$nb;$j++) {
    //Traitement
     
            }
    }
    mais c'est à l'intérieur des 2 boucles que je ne sais pas trop quoi faire. J'ai tenté un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if($t_test[$i]['a'] == $t_test[$j]['a']) {
            $t_test[$i]['a'] = "";
    }
    Je pense pourtant ne pas en être très loin...

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    /*
    * parametres 
    * $ar => le tableau à dédoublonner
    * $critere => le nom du champ référence
    */
    function aru( $ar , $critere ){
    	// création du tableau de sortie
    	$out = array();
    	// création du tableau contenant les références déjà rencontrées
    	$interdits = array();
    	foreach( $ar as $elem ){
    		// si la valeur du champ de référence n'est pas dans le tableau d'interdiction
    		if( !in_array( $elem[ $critere ] , $interdits ){
    			// on ajoute l'élément au tableau de sortie
    			$out[] = $elem;
    			// et on ajoute la valeur du champ de référence au tableau d'interdiction
    			$interdits[] = $elem[ $critere ];
    		}
    		// dans le cas contraire, on ne fait rien, pas la peine de traiter
    	}
    	return $out;
    }
    pour l'utiliser dans ton cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tableau_sans_doublon = aru( $t_tab , 'a' );

  10. #10
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Points : 105
    Points
    105
    Par défaut
    Merci je vais tester ça,

    mais cette ligne, je ne la comprend pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( !in_array( $elem[ $critere ] , $interdits ){

  11. #11
    Inactif  
    Inscrit en
    Novembre 2008
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 255
    Points : 264
    Points
    264
    Par défaut
    Bonjour

    Essaye ça


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     
    function arrayUnique($myArray)
        {
        $newArray = Array();
        if (is_array($myArray))
            {
            foreach($myArray as $key=>$val)
                {
                if (is_array($val))
                    {
                    $val2 = arrayUnique($val);
                    }
                else
                    {
                    $val2 = $val;
                    $newArray=array_unique($myArray);
                    $newArray=deleteEmpty($newArray);
                    break;
                    }
                if (!empty($val2))
                    {
                    $newArray[$key] = $val2;
                    }
                }
            }
        return ($newArray);
        }
     
    function deleteEmpty($myArray)
        {
        $retArray= Array();
        foreach($myArray as $key=>$val)
            {
            if (($key<>"") && ($val<>""))
                {
                $retArray[$key] = $val;
                }
            }
        return $retArray;
        }

  12. #12
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Points : 105
    Points
    105
    Par défaut
    merci, je test tout cela

    aquaa :

    j'ai beau utiliser ta fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	$t_temp = arrayUnique($t_temp);
     
     
    	foreach($t_temp as $tab) {
    		echo $tab['a'];
    	}
    j'affiche et ça ne m'enlève pas le doublon

  13. #13
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Points : 105
    Points
    105
    Par défaut
    Autant pour moi Petibidon, il manquait juste une parenthèse...

    enfin, malgré cela, la fonction ne fonctionne pas.

    Ca doit pourtant être faisable. J'essaie de réadapter vos fonctions...

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Etrange, une fois réparée la coquille, cela fonctionne correctement.

    Comment l'utilises tu ?

  15. #15
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Points : 105
    Points
    105
    Par défaut
    Finalement je viens juste d'y arriver.

    Merci pour ta fonction

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Aide sur tableau 2 dimensions
    Par daddygraffiti dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 21/11/2013, 17h24
  2. image d'arrière plan unique sur tableau
    Par lodan dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 06/07/2006, 09h57
  3. reference sur tableau N dimensions
    Par harsh dans le forum C++
    Réponses: 11
    Dernier message: 28/06/2006, 18h53
  4. Tri sur tableau à 2 dimensions
    Par Poussy-Puce dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 03/03/2006, 19h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo