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

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2018
    Messages : 5
    Points : 1
    Points
    1

    Par défaut Fusionner des tableaux selon leurs similarités

    Bonjour,

    je souhaite coder un script qui me permet de fusionner un nombre de tableaux définis ( pour l'instant ) selon la similarité de leur valeur.

    Etape 1 : j'ai une liste de base avec différentes phrases de différentes tailles.
    Etape 2 : je découpe cette liste en plusieurs tableaux selon le nombre de mots
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $max = 6;
     
    for ($i = 1; $i <= $max; $i++) {
    	${'n'.$i} = array();
    		foreach ( $test as $key => $taille ){
    		$tWord = explode(' ', $taille);
    		$nb = count($tWord);
    			if ($nb == $i){
    				${'n'.$i}[] =  $taille;
    				unset($test[$key]);
    			}
    		}
    	}
    Etape 3 ... et c'est la que je bloque ... je fusionne les X tableaux selon leur similarité.

    J'arrive à fusionner 2 tableau ( le 1 avec le 2, le 3, avec le 4, etc ... ) mais pas tous les compiler
    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
    $max = 6;
    for ($i = 1; $i <= $max; $i++) {
    	$ip = $i + 1 ;
     
    	foreach (${'n'.$i} as $key => $nivsupp) {
    		foreach (${'n'.$ip} as $key2 => $nivinff) {
    			$pos1 = stripos($nivinff, $nivsupp);
    			if ($pos1 !== false) {
    			${'n'.$i}[$nivsupp][] = $nivinff;
    			unset (${'n'.$ip}[$key2]);
    			unset(${'n'.$i}[$key]);
    			}
    		}
    	}
    }

    Exemple d'utilisation
    Bonjour
    bonjour toi
    bonjour toi, comment tu t'appel
    Salut
    Salut sacha
    Salut sacha ça va ?
    Je voudrais que le script me retourne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array('Bonjour' => array( "bonjour toi")=> array( "bonjour toi, comment tu t'appel") , 'Salut' => array("Salut sacha")=> array( "Salut sacha ça va ?") );

    Merci pour votre aide

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2018
    Messages : 5
    Points : 1
    Points
    1

    Par défaut

    Lol, parfois poser une question éclaire son propre esprit.

    La solution que j'ai trouvé est de faire non pas une incrémentation, mais une décrémentation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for ($i = 6; $i >= 0; $i--) {
    	$ip = $i + 1 ;
    	foreach (${'n'.$i} as $key => $nivsupp) {
    		foreach (${'n'.$ip} as $key2 => $nivinff) {
    				$pos1 = stripos($nivinff, $nivsupp);
    				if ($pos1 !== false) {
    				${'n'.$i}[$nivsupp][] = ${'n'.$ip}[$key2];
    				unset (${'n'.$ip}[$key2]);
    				unset(${'n'.$i}[$key]);
    				}
    		}
    	}
    }

    Je ne met pas de suite en résolu, car je pense qu'il existe des façon de faire plus pro que vous connaissez surement ^^

    Merci

  3. #3
    Modérateur
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    4 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 4 656
    Points : 11 526
    Points
    11 526
    Billets dans le blog
    5

    Par défaut

    Salut,

    purée, c'est pas clair tes explications et puis quand je teste ton code je me retrouve avec ceci $taille = 'Bonjour';, non mais WTF ??!!!??!!
    le résultat attendu contient une erreur :
    array('Bonjour' => array( "bonjour toi")=> array( "bonjour toi, comment tu t'appel") , 'Salut' => array("Salut sacha")=> array( "Salut sacha ça va ?") );
    je pars du principe que la compatibilité avec UTF-8 doit être assurée vu que c'est devenu la norme universelle pour l'encodage des textes

    pour compter les mots, c'est simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // UTF-8
    $test = ['Bonjour', 'bonjour toi', "bonjour toi, comment tu t'appel", 'Salut', 'Salut sacha', 'Salut sacha ça va ?'];
     
    $nb_words = [];
    foreach ($test as $v) {
        $nb_words[] = mb_substr_count(trim($v), ' ') + 1;
    }
    après corrige ton résultat attendu parce que je ne vois pas où tu veux en venir.
    # Dans la Création, tout est permis mais tout n'est pas utile...

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2018
    Messages : 5
    Points : 1
    Points
    1

    Par défaut

    purée, c'est pas clair tes explications et puis quand je teste ton code je me retrouve avec ceci $taille = 'Bonjour';, non mais WTF ??!!!??!!
    le résultat attendu contient une erreur :
    LOL, je vais faire un effort, dsl.

    Je sais compter les mots.

    En fait, j'envoi une liste de mot et de phrases, contenu dans le tableau $test.

    avec cette partie du script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $max = 6;
     
    for ($i = 1; $i <= $max; $i++) {
    	${'n'.$i} = array();
    		foreach ( $test as $key => $taille ){
    		$tWord = explode(' ', $taille);
    		$nb = count($tWord);
    			if ($nb == $i){
    				${'n'.$i}[] =  $taille;
    				unset($test[$key]);
    			}
    		}
    Il va créer 6 tableaux. Le tableau 1 contient les entrées du tableau $test avec UN mot, le tableau 2 contient les entrées avec DEUX mots, etc ..

    Et ce que je voudrais, c'est fusionner tous ces tableau de manière logique.

    Si "Bonjour" du tableau 1
    est présent dans des entrées du tableau 2 ( par exemple "Bonjour comment ça va" )
    alors je fusionne ces entrées du tableau 2
    sur le tableau 1, avec pour clé [Bonjour]=>array("Bonjour comment ça va");



    Est ce que ça vous parait plus clair ? ^^

  5. #5
    Modérateur
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    4 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 4 656
    Points : 11 526
    Points
    11 526
    Billets dans le blog
    5

    Par défaut

    Ok,
    tu dois répéter la même logique que celle du tableau 1 avec le tableau 2 comme référence, puis 3, etc ?
    # Dans la Création, tout est permis mais tout n'est pas utile...

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2018
    Messages : 5
    Points : 1
    Points
    1

    Par défaut

    Oui,

    et en prenant le problème à l'envers, c'est à dire avec une décrémentation de ma boucle for :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for ($i = 6; $i >= 0; $i--) {
    	$ip = $i + 1 ;
    	foreach (${'n'.$i} as $key => $nivsupp) {
    		foreach (${'n'.$ip} as $key2 => $nivinff) {
    				$pos1 = stripos($nivinff, $nivsupp);
    				if ($pos1 !== false) {
    				${'n'.$i}[$nivsupp][] = ${'n'.$ip}[$key2];
    				unset (${'n'.$ip}[$key2]);
    				unset(${'n'.$i}[$key]);
    				}
    		}
    	}

    J'ai la solution que je veux.

    Je demandais, dans mon second message, s'il y avait une solution plus intelligente / professionnelle d'agir ?

    Merci

  7. #7
    Modérateur
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    4 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 4 656
    Points : 11 526
    Points
    11 526
    Billets dans le blog
    5

    Par défaut

    Voici une approche plus courte :
    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
    $test = ['Bonjour', 'bonjour toi', "bonjour toi, comment tu t'appel", 'Salut', 'Salut sacha', 'Salut sacha ça va ?'];
     
    $nb_words = [];
    foreach ($test as $v) {
        $nb_words[$v] = count(explode(' ', trim($v)));
    }
     
    // tri des chaines des plus courtes vers les plus longues en nombre de mots
    asort($nb_words, SORT_NUMERIC);
    // tableau des mots triés
    $words = array_keys($nb_words);
    // tableau des résultats
    $data = array_fill_keys($words, []);
     
    for ($i = 0, $count = count($nb_words) ; $i < $count ; ++$i) {
        $needle = $words[$i];
        foreach (array_slice($words, $i + 1) as $v) {
            if (stripos($v, $needle) !== false) {
                $data[$needle][] = $v;
            }
        }
    }
    Dis moi si cela passe tes tests.
    # Dans la Création, tout est permis mais tout n'est pas utile...

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2018
    Messages : 5
    Points : 1
    Points
    1

    Par défaut

    Top

    J'ai du mal à comprendre cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $data = array_fill_keys($words, []);
    Pourquoi "[]" ? Je vais aussi chercher de mon côté.

    Merci.

  9. #9
    Modérateur
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    4 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 4 656
    Points : 11 526
    Points
    11 526
    Billets dans le blog
    5

    Par défaut

    on prépare juste le tableau des résultats en définissant les clés (les mots de tes phrases $words) et on dit juste que pour chaque clé, il y aura un tableau vide par défaut comme valeur [].
    Ainsi quoi qu'il arrive, tu sais que tu manipuleras des tableaux sur toute la ligne.
    # Dans la Création, tout est permis mais tout n'est pas utile...

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

Discussions similaires

  1. déplacer des fichiers selon leur extension
    Par chicabonux dans le forum Shell et commandes GNU
    Réponses: 13
    Dernier message: 12/10/2009, 16h42
  2. Lire des fichiers selon leur nom
    Par guiguilelotois dans le forum LabVIEW
    Réponses: 4
    Dernier message: 18/05/2009, 13h55
  3. [Flash MX] Supprimer des carte selon leurs valeurs
    Par Lenalyon dans le forum Flash
    Réponses: 1
    Dernier message: 01/09/2007, 12h18
  4. Fusionner des tableaux
    Par Neuromancien2 dans le forum VBScript
    Réponses: 5
    Dernier message: 15/06/2007, 15h52
  5. taille des textbox selon leur contenu
    Par christi dans le forum ASP.NET
    Réponses: 4
    Dernier message: 08/02/2007, 16h20

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