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

EDI, CMS, Outils, Scripts et API PHP Discussion :

Fusionner des tableaux selon leurs similarités


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  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 : 33
    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 : 33
    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
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    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.

  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 : 33
    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
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    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 ?

  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 : 33
    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
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    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.

  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 : 33
    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
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    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.

+ 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