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 :

Comment recherché et modifier dans un tableau de tableau (problème homonyme)


Sujet :

Langage PHP

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut Comment recherché et modifier dans un tableau de tableau (problème homonyme)
    Bonjour,

    Je mon présente mon contexte :

    J'ai un fichier CSV que je parcours via une fonction "fgetcsv()". A partir des différentes informations obtenues (Nom, prénom, N° de matricule), j'enregistre celle ci dans un tableau de tableau (multidimensionnelle) avec les nom, prénom, N° de matricule et un user (créer à partir de la règle suivante : nom.prenom) et je créer aussi un autre tableau avec une donnée bien spécifique (des N° de matricule) qui me servira pour la suite de mon script.

    Ensuite, je dédoublonne mon tableau de tableau à l'aide de mon tableau spécifique et de la fonction "array_unique()".

    J'ai donc un tableau de tableau qui contienne des N° de matricule tous différents. Jusqu'ici, aucun problème !

    Ma problématique :

    Ensuite, j'ai remarqué dans mon tableau de tableau dédoublonné au niveau des N° de matricule, j'ai des homonymes (Même nom et prénom) et donc des users identique ! Et cela me pose problème pour la suite de mon projet car je dois avoir aussi des users unique ! Sauf qu'ici, il ne m'est pas possible de supprimer des users en doublons car ce sont quand même des personnes différentes.

    Donc se que je recherche à faire est :

    Si tu as des homonymes dans le tableau (même nom et prénom et donc même user), tu rends ces users unique en les modifiants (en suivant la règle suivante : ajouté un N° par exemple 1,2,3,4...)

    Et donc comment faire ceci ?

    Début de solution :

    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
    <?php
    $array = array();
    $array[] = array('Add','B','C');
    $array[] = array('Bsq','R','Q');
    $array[] = array('Cerf','G','L');
    $array[] = array('Cf','B','L');
    $array[] = array('Atd','B','C');
    $array[] = array('Cf','Y','M');
    $array[] = array('Add','U','X');
     
    $i = 1;
    foreach($array as $cle => $valeur)
    {
    	// Parcours du tableau où la valeur est à rechercher dans une colonne spécifique
    	foreach($array as $key => $row)
    	{
    		if ($row[0] == $valeur[0] && $cle != $key)
    		{
    			$array[$key] = array($row[0].$i,$row[1],$row[2]);
    			$i++;
    		}
    	}
    	$i = 1;
    }
     
    echo '<pre>';
    print_r($array);
    echo '</pre>';
    ?>
    Résultat
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    Array
    (
        [0] => Array
            (
                [0] => Add1
                [1] => B
                [2] => C
            )
     
        [1] => Array
            (
                [0] => Bsq
                [1] => R
                [2] => Q
            )
     
        [2] => Array
            (
                [0] => Cerf
                [1] => G
                [2] => L
            )
     
        [3] => Array
            (
                [0] => Cf1
                [1] => B
                [2] => L
            )
     
        [4] => Array
            (
                [0] => Atd
                [1] => B
                [2] => C
            )
     
        [5] => Array
            (
                [0] => Cf1
                [1] => Y
                [2] => M
            )
     
        [6] => Array
            (
                [0] => Add1
                [1] => U
                [2] => X
            )
    )
    C'est bien, cela fonctionne bien, sauf que je renomme tout les homonymes, alors que mois je ne veux pas renommé le 1er du couple, mais les suivants...

    Merci encore une fois pour vos lumières !

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Bonjour,

    Logiquement, un matricule est unique. Donc, tu construit ton tableau autrement, et tu n'aura pas de doublons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
      //-- si on consdère que fgetcsv() retourne 3 variables : ---------------------
      //-- $nom, $prenom, $matricule -----------------------------------------------
      $array[$matricule]['nom'] = $nom;
      $array[$matricule]['prenom'] = $prenom;
      $array[$matricule]['user'] = $nom . $prenom;
    ?>

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    oui normalement les N° d'imatricules sont uniques, sauf que dans mon fichier CSV cela n'est pas le cas.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    A un matricule donné doit toujours correspondre la même personne, sinon, ça n'a pas beaucoup de sens.
    Donne quelques lignes de ton csv, avec des doublons en matricule.

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    non, mais les matricules ont s'en fou, c'est pas mon problème.

    Mon fichier CSV est bien plus compliqué que mon exemple.

    En gros, j'ai des utilisateurs qui sont identique, avec le même matricule. Va savoir quoi mon fichier est comme ca, je ne sais pas, il ne vient pas de moi. C'est pour cela que je vire les doublons suivant les matricules. Je ne veux pas me servire des N° de matricule en clé pour des raisons personnelles.

    Mon problème est surtout de géré les homonymes, des personnes qui ont le meme nom et meme prénom mais qui sont deux personnes différentes. Et vu que dans mon logiciel on je vais exporter mon fichier, je dois leur générer un user, (suivant la régle du nom.prenom) pour les homonyme, j'aurai le même user. Il faut donc qu'à partir de ce user, je lui mettre quelque chose pour qu'il soit différent, j'ai donc pensé à un chiffre tout simplement.

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    foreach($array as $cle => $valeur)
    {
    	// Parcours du tableau où la valeur est à rechercher dans une colonne spécifique
    	foreach($array as $key => $row)
    	{
    		if ($row[0] == $valeur[0] && $cle != $key)
    		{
    			$array[$key] = array($row[0].$i,$row[1],$row[2]);
    			$i++;
    		}
    	}
    	$i = 1;
    }
    en faite mon script fonctionne bien, le soucie est que lorsque je renomme un homonyme, tout va bien, mais le tableau array que je parcours avec le 1er foreach n'est pas mis à jours, d'où la raison sur le pourquoi il me renomme le 1er homonyme et le suivant...

  7. #7
    Invité
    Invité(e)
    Par défaut
    C'est le comportement attendu de foreach(), utiliser for() ou bien faire une petite modification sur le if()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ($row[0] == $valeur[0] && $cle < $key)

  8. #8
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    j'ai tester, mais cela ne fonctionne pas pour une modification du IF

    afin de mieux si retrouvé avec les valeurq de mon tableau de tableau, j'ai mis des "prénoms"

    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
    <?php
     
    $array = array();
    $array[] = array('TOTO','B','C');
    $array[] = array('MIMI','R','Q');
    $array[] = array('MIMI','R','Q');
    $array[] = array('TOTO','B','C');
    $array[] = array('RORO','R','Q');
     
     
    // homonyme
    echo '<pre>';
    print_r($array);
    echo '</pre>';
     
    foreach($array as $cle => $valeur)
    {
    	// Parcours du tableau où la valeur est à rechercher dans une colonne spécifique
    	foreach($array as $key => $row)
    	{
    		if ($row[0] == $valeur[0] && $cle < $key)
    		{
    			$array[$key] = array($row[0].$i,$row[1],$row[2]);
    			$i++;
    		}
    	}
    	$i = 1;
    }
    echo '<pre>';
    print_r($array);
    echo '</pre>';
     
    ?>
    affichage :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    Array
    (
        [0] => Array
            (
                [0] => TOTO
                [1] => B
                [2] => C
            )
     
        [1] => Array
            (
                [0] => MIMI
                [1] => R
                [2] => Q
            )
     
        [2] => Array
            (
                [0] => MIMI
                [1] => R
                [2] => Q
            )
     
        [3] => Array
            (
                [0] => TOTO
                [1] => B
                [2] => C
            )
     
        [4] => Array
            (
                [0] => RORO
                [1] => R
                [2] => Q
            )
     
    )
     
    Array
    (
        [0] => Array
            (
                [0] => TOTO
                [1] => B
                [2] => C
            )
     
        [1] => Array
            (
                [0] => MIMI
                [1] => R
                [2] => Q
            )
     
        [2] => Array
            (
                [0] => MIMI1
                [1] => R
                [2] => Q
            )
     
        [3] => Array
            (
                [0] => TOTO
                [1] => B
                [2] => C
            )
     
        [4] => Array
            (
                [0] => RORO
                [1] => R
                [2] => Q
            )
     
    )
    au départ j'ai :

    TOTO
    TOTO
    MIMI
    MIMI
    TOTO
    RORO


    A la fin :

    TOTO
    TOTO
    MIMI
    MIMI1
    TOTO1
    RORO

    et ton idée sur la modification du foreash en for s'était quoi ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par arnaudperfect Voir le message
    j'ai tester, mais cela ne fonctionne pas pour une modification du IF

    afin de mieux si retrouvé avec les valeurq de mon tableau de tableau, j'ai mis des "prénoms"

    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
    <?php
     
    $array = array();
    $array[] = array('TOTO','B','C');
    $array[] = array('MIMI','R','Q');
    $array[] = array('MIMI','R','Q');
    $array[] = array('TOTO','B','C');
    $array[] = array('RORO','R','Q');
     
     
    // homonyme
    echo '<pre>';
    print_r($array);
    echo '</pre>';
     
    foreach($array as $cle => $valeur)
    {
    	// Parcours du tableau où la valeur est à rechercher dans une colonne spécifique
    	foreach($array as $key => $row)
    	{
    		if ($row[0] == $valeur[0] && $cle < $key)
    		{
    			$array[$key] = array($row[0].$i,$row[1],$row[2]);
    			$i++;
    		}
    	}
    	$i = 1;
    }
    echo '<pre>';
    print_r($array);
    echo '</pre>';
     
    ?>
    Elle est passée où la ligne "$i=1;" qu'il y avait avant le premier foreach ? Quelqu'un avait faim ?

    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
     
    <?php
     
    $array = array();
    $array[] = array('TOTO','B','C');
    $array[] = array('MIMI','R','Q');
    $array[] = array('MIMI','R','Q');
    $array[] = array('TOTO','B','C');
    $array[] = array('RORO','R','Q');
     
    $i = 1;
    foreach($array as $cle => $valeur)
    {
    	// Parcours du tableau où la valeur est à rechercher dans une colonne spécifique
    	foreach($array as $key => $row)
    	{
    		if ($row[0] == $valeur[0] && $cle < $key)
    		{
    			$array[$key] = array($row[0].$i,$row[1],$row[2]);
    			$i++;
    		}
    	}
    	$i = 1;
    }
    echo '<pre>';
    print_r($array);
    echo '</pre>';
     
    ?>
    Citation Envoyé par arnaudperfect Voir le message
    et ton idée sur la modification du foreash en for s'était quoi ?
    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
     
    <?php
     
    $array = array();
    $array[] = array('TOTO','B','C');
    $array[] = array('MIMI','R','Q');
    $array[] = array('MIMI','R','Q');
    $array[] = array('TOTO','B','C');
    $array[] = array('RORO','R','Q');
     
     
    $i = 1;
    for ($x=0, $z=count($array); $x<$z; ++$x)
    {
    	// Parcours du tableau où la valeur est à rechercher dans une colonne spécifique
      for ($y=$x+1; $y<$z; ++$y)
      {
    		if ($array[$x][0] == $array[$y][0])
    		{
    			$array[$y][0] .= $i;
    			$i++;
    		}
    	}
    	$i = 1;
    }
    echo '<pre>';
    print_r($array);
    echo '</pre>';
     
    ?>
    Si tu veux savoir comment moi je ferais, j'utiliserais le hash des array
    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
     
    <?php
     
    $array = array();
    $array[] = array('TOTO','B','C');
    $array[] = array('MIMI','R','Q');
    $array[] = array('MIMI','R','Q');
    $array[] = array('TOTO','B','C');
    $array[] = array('RORO','R','Q');
     
    $doublons = array();
    foreach ($array as $cle => $valeur)
    {
      if (isset($doublons[$valeur[0]])) {
        $array[$cle][0] .= ++$doublons[$valeur[0]];
      }
      else $doublons[$valeur[0]] = 0;
    }
     
    echo '<pre>';
    print_r($array);
    echo '</pre>';
     
    ?>

  10. #10
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    effectivement, il y a du niveau !

    Je ne connait même pas la notion de "hash des array".et au niveau algo j'aurai été loin de proposé ta solution. Je vais étudier cela de près.

    J'ai appris de nouvelle chose ! et bien merci bcp !

    P.S : j'en demande bcp, mais si tu peux m'expliquer un peu tes algo je suis preneur ! mon but est d'apprendre et non prendre bêtement les solutions que l'on me propose sans réfléchir au boulot qu'il y a dessus !

  11. #11
    Invité
    Invité(e)
    Par défaut
    Le code avec la double boucle foreach() a été fait par toi, donc tu comprends comment elles fonctionnent, mais peut-être pas pourquoi les tableaux dans ces foreach() ne se modifiaient pas alors que $array l’était. La réponse est simple, foreach() fait une copie du tableau et travail sur cette copie. Avec PHP4 c’est sans appel, par contre avec PHP5 il existe une syntaxe pour forcer foreach() à utiliser l’original et non la copie.

    Donc, les 2 boucles foreach() travaillaient sur des copies et testaient à nouveau 2 vs 1 avec les données originales même si 1 vs 2 avait déjà altérer le $array. En écrivant $cle < $key alors le test 2 vs 1 n’est pas exécuté et n’a pas besoin de l’être car 1 vs 2 a déjà été fait. J’ai suggéré cette petite modification car je ne savais pas si tu étais sous PHP4 ou PHP5.

    NOTE : le code avec la double boucle foreach() avec la petite modification est tout à fait correct.

    Le code avec la double boucle for() se contente seulement d’éliminer le besoin de tester $cle != $key car $j=$i+1 s’assure que $i sera toujours plus petit que $j. Rien de spécial sur ce code.

    Maintenant, le dernier code... en PHP, l’index des array() ou si tu préfères la clé des tableaux n’ont pas besoin d’être numérique, en fait il ne sont jamais stocker dans une logique numérique. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <pre>
    <?php
     
    $array = array();
    $array[2] = 'premier';
    $array[1] = 'dernier';
     
    print_r($array);
     
    ?>
    </pre>
    affichera:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Array
    (
        [2] => premier
        [1] => dernier
    )
    où le 2 est avant le 1… et aucun 0.

    L’avantage majeur, est qu’en PHP on peut aussi écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <pre>
    <?php
     
    $array = array();
    $array['bonjour'] = 'premier';
    $array['salut'] = 'dernier';
     
    print_r($array);
     
    ?>
    </pre>
    Donc, on peut simplement utiliser les données à dé-doublonner comme clé d’un tableau de travail et le isset() indique à coup sûre si cet donnée a déjà été rencontrée. J’utilise aussi la valeur pour stocker quel était le numéro du dernier doublon. Si isset est à true, alors un ++ suffit dans ce cas... alors qu’avec isset à false, il suffit de créé une nouvelle clé selon la donnée à dé-doublonner et 0 comme valeur...

    Peut-être plus simple d’utiliser les données du array() de ton exemple et de suivre étape par étape ce qui se passe (grosso modo) :

    PREMIÈRE BOUCLE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Code : foreach ($array as $cle => $valeur)
    Données : array('TOTO','B','C')
     
    Code : if (isset($doublons[$valeur[0]])) {
    Données : isset($doublons['TOTO']) 
    Résultat : false
     
    Code : else $doublons[$valeur[0]] = 0;
    Données : $doublons['TOTO'] = 0;
    DEUXIÈME BOUCLE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Code : foreach ($array as $cle => $valeur)
    Données : array('MIMI','R','Q')
     
    Code : if (isset($doublons[$valeur[0]])) {
    Données : isset($doublons['MIMI']) 
    Résultat : false
     
    Code : else $doublons[$valeur[0]] = 0;
    Données : $doublons['MIMI'] = 0;
    TROISIÈME BOUCLE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Code : foreach ($array as $cle => $valeur)
    Données : array('MIMI','R','Q')
     
    Code : if (isset($doublons[$valeur[0]])) {
    Données : isset($doublons['MIMI']) 
    Résultat : true
     
    Code : $array[$cle][0] .= ++$doublons[$valeur[0]];
    Données : $array[2][0] .= ++$doublons['MIMI']
    Données : $doublons['MIMI'] = ++0
    Résultat : $doublons['MIMI'] = 1
    Données : $array[2][0] .= 1
    Résultat : $array[2][0] = 'MIMI1'
    Et ainsi de suite… mais ton code original avec la petite modification $cle < $key est tout à fait correct.

    J'espère que j'ai pas été trop mauvaise, parce que expliquer n'est manifestement pas ma matière forte

  12. #12
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Le code avec la double boucle foreach() a été fait par toi, donc tu comprends comment elles fonctionnent, mais peut-être pas pourquoi les tableaux dans ces foreach() ne se modifiaient pas alors que $array l’était. La réponse est simple, foreach() fait une copie du tableau et travail sur cette copie. Avec PHP4 c’est sans appel, par contre avec PHP5 il existe une syntaxe pour forcer foreach() à utiliser l’original et non la copie.
    Je ne le savais pas, mais je l'avais remarqué sans avoir de fondement sur ce phénomène concernant le foreach() qui ne m'était pas à jour en direct le tableau !

    en tout cas merci bcp pour ton aide ! j'ai pu faire une autre fonction dérivé pour supprimer des doublons !

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <?php
    function unique_array_two_dimentions($array,$column_test)
    {
    	$doublons = array();
    	$temp = array();
    	foreach ($array as $cle => $valeur)
    	{
    		if (!isset($doublons[$valeur[$column_test]]))
    		{
    			$doublons[$valeur[$column_test]] = 0;
    			$temp[] = $array[$cle];
    		}
    	}
    	return $temp;
    }
     
    function manage_same_array_two_dimentions($array,$column_test)
    {
    	$doublons = array();
    	foreach ($array as $cle => $valeur)
    	{
    		if (isset($doublons[$valeur[0]]))
    		{
    			// on met un idice pour les homonymes
    			$array[$cle][0] .= '.'.++$doublons[$valeur[0]];
    		}
    		else
    		{
    			$doublons[$valeur[0]] = 0;
    		}
    	}
    	return $array;
    }
     
    $array = array();
    $array[] = array('TOTO','B','C');
    $array[] = array('MIMI','R','Q');
    $array[] = array('MIMI','R','Q');
    $array[] = array('RORO','R','Q');
    $array[] = array('TOTO','C','C');
    $array[] = array('TOTO','B','C');
    $array[] = array('BOBO','R','Q');
    $array[] = array('RORO','C','Q');
     
    echo '<pre>';
    print_r($array);
    echo '</pre>';
     
    echo '<pre>';
    print_r(manage_same_array_two_dimentions(unique_array_two_dimentions($array,0),1));
    echo '</pre>';
     
    ?>

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

Discussions similaires

  1. [Batch] Comment rechercher une valeur dans la base de registre et la modifier
    Par elminio75 dans le forum Scripts/Batch
    Réponses: 14
    Dernier message: 13/03/2018, 09h16
  2. [C#] Comment rechercher un contrôle dans un FormView ?
    Par bleuerouge dans le forum ASP.NET
    Réponses: 4
    Dernier message: 11/09/2006, 16h43
  3. Comment rechercher le symbol % dans un champ?
    Par nmathon dans le forum Oracle
    Réponses: 3
    Dernier message: 18/01/2006, 17h01
  4. [FLASH] comment rechercher l'info dans un XML
    Par hatice83 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 14/12/2005, 11h57
  5. Comment rechercher une chaine dans plusieurs tables ?
    Par tsing dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/11/2005, 18h04

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