[RESOLU] Insérer mots aléatoirement dans un texte auto généré

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

29 avr. 2016, 11:53

@Zork, pour le début effectivement ça y ressemblait, mais c'est l'intérêt de l'injection dans un autre texte qui m'échappe toujours :)

@psi (woppa gangnam.. hum... :))

Pour illustrer le principe :
$texte = ''; // variable contenant le texte final
// liste des phrases à injecter (ou éventuellement des liens)
$phrases = array (3 => 'petit déjeuner chez moi', 7 => 'petit déjeuner chez toi', 12 => 'petit déjeuner chez l\'ami ricoré');
// liste des mots du texte à perturber
$mots = array('le', 'soleil', 'vient', 'de', 'se', 'lever,', 'encore', 'une', 'belle', 'journée,', 'c\'est', 'l\'heure', 'du', 'petit', 'déjeuner');
for ($i=0; $i < count($texte); $i++) { // pour chacun des mots du texte
  $texte.= $mots[$i] . ' '; // on concatene le mot dans la variable texte
  if (isSet($phrases[$i])) // si on trouve une phrase pour la même clé
    $texte.= $phrases[$i] . ' '; // on l'ajoute également
}
echo $texte; // et voilà le travail
Reste à constituer convenablement les tableaux de mots et de phrases ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 31 Messages

02 mai 2016, 09:38

C'est un peu plus clair, merci!
Cependant j'ai bien mon array $phrases contenant toutes mes phrases, mon array $mots contenant les mots récupérer de mon explode() de $texte, mais je n'arrive toujours pas à savoir ou exécuter un rand...
Pour le moment il m'affiche le texte complet avec à la fin la 1ère phrase de $phrases.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

02 mai 2016, 12:20

Le rand a pour objectif de déterminer de façon aléatoire à quel moment intégrer ta phrase lorsque tu reconstitues le texte.
Plusieurs solutions sont envisageable en fonction de ton besoin : faut-il inclure toutes les phrases générées ? quelques une seulement ? faut-il un intervalle régulier entre 2 phrases ? ...

Dans l'exemple ci-dessus j'ai indexé chaque phrase avec un nombre aléatoire. Pour cela il te faut générer autant de nombre que tu as de phrases (foreach). Chacun de ces nombre doit être compris entre 1 et le nombre de mots de ton texte, avec mt_rand(). Pour chacun des nombres générés tu le stockes dans un tableau et tu lui associes une phrase, tu obtiendras ainsi le tableau de phrases ci-dessus :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 31 Messages

03 mai 2016, 09:34

Pour le moment je dirais : que je dois inclure toutes les phrases a intervalle régulier..?
Mais ton exemple donne le même résultat que moi... le texte suivi du 1er mot.

Eléphanteau du PHP | 31 Messages

03 mai 2016, 10:52

J'avais complètement laissé de coté la solution de @Spols :
si le texte n'est plus aléatoire, il faudra alors tirer au hasard un nombre entre 0 et la taille de ton tableau texte (le nombre de mot) pour chaque phrase et l'insérer à l'endroit voulu avec

array_merge(array_slice($texte,0,$i),$phrase,array_slice($texte,$i));

où $i est ton nombre tirer au hasard.
Je viens de réessayer avec tes info en plus @Ryle et j'arrive a un résultat un peu plus proche du résultat recherché!
$i = mt_rand(0, 814);

$final_texte = array_merge(array_slice($mots, 0, $i), $phrases, array_slice($mots, $i));

$final_texte = implode($final_texte, ' ');
echo $final_texte;
Ce qui m'affiche le texte avec a l’intérieur à un endroit aléatoire toutes mes phrases.

Je viens d'ailleurs de voir ce poste :
Tu dois être dans un foreach($tab_phrase => $phrase) afin d'insérer les phrases une à une
Il vaut mieux tirer tes nombres au hasard avant les insertions et les faire dans l'ordre croissant pour éviter l'insertion d'une phrase dans une phrase
Je ne vois pas a quel endroit le faire... :priere:

Eléphanteau du PHP | 31 Messages

04 mai 2016, 12:25

Un petit up car après plusieurs tentatives je n'arrive toujours pas a associer mes phrases avec les nombres généré aléatoirement...
Surtout que je sais que c'est la dernière chose qui bloque pour que ça fonctionne!
Je commence à désespérer...

Mammouth du PHP | 1967 Messages

04 mai 2016, 14:20

Montre nous ton code actuel.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 31 Messages

04 mai 2016, 15:07

Voila ce que j'ai actuellement :
if (!empty($_POST)) {
    $spinning = new spinning();
    $string = $_POST['ameliorer'];
    $lien = $_POST['website'];
    $spinning->process($string);
    $tab_spinning = $spinning->results;
    $tab = array();

    foreach ($tab_spinning as $all) {
        $tab[] = sizeof($all);
    }
    for ($i = 0; $i < array_product($tab); $i++) {
        $phrase = array();
        foreach ($tab as $cle => $taille) {
            $index = array_product(array_slice($tab, $cle + 1));
            $final_index = floor($i / $index) % $taille;
            $phrase[] = $tab_spinning[$cle][$final_index];
        }
        $phrase = implode($phrase, ' ');
        
        $phrases[] = "<a href='$lien'>" . $phrase . "</a>";
        $keys[] = mt_rand(1, 814);
    }

    $texte = "...";
    $mots = explode(' ', $texte);

    foreach ($phrases as $i => $phrase) {
        $keys = array_keys($phrases);

        $final_texte = array_merge(array_slice($mots, 0, $i), $phrases, array_slice($mots, $i));
        $final_texte = implode($final_texte, ' ');
    }
    
    echo $final_texte;
}
Et j'obtient ça:

Roméo et [...] annexes pour améliorer le J'ai manger les gâteaux chez moi J'ai manger les gâteaux chez toi J'ai manger les gâteaux chez lui J'ai manger les gâteaux chez nous J'ai manger les gâteaux chez vous J'ai manger les gâteaux chez le président [...] Tu as fini le chien chez vous Tu as fini le chien chez le président récit. Chaque personnage se voit attribuer une forme poétique particulière, qui peut varier au fil de son évolution...

Mammouth du PHP | 1967 Messages

04 mai 2016, 15:36

tu rempli ton tableau $keys à chaque phrase, mais tu l'écrase dans ton dernier foreach

tu ferai mieux d'y récupèrer la valeur aléatoire
foreach ($phrases as $i => $phrase) {
      $mots = array_merge(array_slice($mots, 0, $keys[$i]), $phrases, array_slice($mots, $keys[$i]));
    }
        $final_texte = implode($mots, ' ');
tu mélange $mots et $final_texte se qui regroupait tes phrases au même endroit
mais tu doit faire ton implode aprés ta boucle

il faut aussi savoir qu'avec un code pareil, si tu a un texte de 814 mots et 96 phrases, il est peut probable d'avoir tes phrases à la fin du texte.
$keys[] = mt_rand(1, 814 + $i); devrait corriger cela
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 31 Messages

04 mai 2016, 16:01

:( Ça ne fonctionne pas non plus il m'affiche maintenant 192 fois le tableau de mots a l’intérieur du texte... :shock:

Eléphanteau du PHP | 31 Messages

09 mai 2016, 09:49

Up de retour! désolé...
Après plusieurs tentatives toujours pas de solution trouvé...

A l'heure actuelle si j'ai 4 phrases dans mon $phrases il m'insère 4 fois le tableau dans le texte au lieu d'insérer les 4 phrases.
Si j'en ai 25 il me l'insère 25 fois...

Need help! :priere:

Mammouth du PHP | 1967 Messages

09 mai 2016, 10:34

$mots = array_merge(array_slice($mots, 0, $keys[$i]), $phrase, array_slice($mots, $keys[$i]));
Le problème avec les variables tableaux au pluriel qu'on divise avec un singulier, c'est qu'on a vite fait d'inverses les variables
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 31 Messages

09 mai 2016, 10:59

J'avais déjà essayer mais il me retourne des erreurs :

" array_merge(): Argument #2 is not an array in ..."

" array_slice() expects parameter 1 to be array, null given ...

"array_merge(): Argument #1 is not an array in ..."

Mammouth du PHP | 1967 Messages

09 mai 2016, 11:30

$mots = array_merge(array_slice($mots, 0, $keys[$i]), array($phrase), array_slice($mots, $keys[$i]));
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 31 Messages

09 mai 2016, 11:44

MERCI!!!

C'étais simplement ça... 8-|