[RESOLU] Lire des tableaux de tableaux en boucle

Eléphanteau du PHP | 31 Messages

15 avr. 2016, 13:00

Bonjour,

Alors je m'explique, je suis en train d'apprendre le php et pour un exercice je dois créer un formulaire qui lorsqu'on rempli le text area et qu'on envoie il nous affiche toute les combinaisons possible...

Du coup j'ai récupérer un script de content spinning j'aimerais a partir de ça :
<html>
    <body>
        <?php
 
        class spinning {
            public $results = array();
            public function process($text) {
                preg_replace_callback(
                        '/\{(((?>[^\{\}]+)|(?R))*)\}/x', array($this, 'combine'), $text
                );
                 
            }
            public function combine($text) {
                $this->results[] = explode('|', $text[1]);
            }
        }
 
        if (!empty($_POST)) {
            $spinning = new spinning();
 
            $string = $_POST['ameliorer'];
            $spinning->process($string);
            print_r($spinning->results);
        }
 
        ?>
 
        <form method="post" action="seo.php">
            <textarea name="ameliorer" id="ameliorer" rows="5" cols="100"></textarea>
            <input type="submit" value="Envoyer">
        </form>
 
    </body>
</html>
Faire en sorte que lorsque je rentre dans le texte area par exemple :
"
J'ai {manger|croquer|jeté|fini} {les gâteaux|les bonbons|la tarte|le chien} {chez moi|chez toi|chez lui|chez nous|chez vous|chez le président}
"
et que je clique sur envoyer il m'affiche toute les combinaisons logique possibles...

Pour le moment il me génère "simplement" un tableau de tableaux :
<html>
    <body>
        Array
(
    [0] => Array
        (
            [0] => manger
            [1] => croquer
            [2] => jeté
            [3] => fini
        )
 
    [1] => Array
        (
            [0] => les gâteaux
            [1] => les bonbons
            [2] => la tarte
            [3] => le chien
        )
 
    [2] => Array
        (
            [0] => chez moi
            [1] => chez toi
            [2] => chez lui
            [3] => chez nous
            [4] => chez vous
            [5] => chez le président
        )
 
)
 
        <form method="post" action="seo.php">
            <textarea name="ameliorer" id="ameliorer" rows="5" cols="100"></textarea>
            <input type="submit" value="Envoyer">
        </form>
 
    </body>
</html>
Du coup j'aimerais faire en sorte qu'au final il m'affiche :

J'ai manger les gâteaux chez moi
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
J'ai manger les bonbons chez moi
J'ai manger les bonbons chez toi
[...]
J'ai fini le chien chez vous
J'ai fini le chien chez le président

Voila j’espère que j'ai bien expliquer mon problème!
Merci ;)

Mammouth du PHP | 1967 Messages

15 avr. 2016, 13:21

Si tu ne connais pas le niveau de profondeur à l'avance (c'est le nombre de partie de phrase variable) Ce n'est pas un problème simple.
Je pense en premier lieu à une fonction récursive mais c'est pas le plus simple
Je pense ensuite à utiliser du SQL et des jointure entre les tables sans conditions

Mais finalement à la réflection le plus "simple" est de multiplier le nombre de possibilité de chaque partie ensemble, tu obtiens ainsi le nombre de phrase à créer tu peux donc boucler sur ce nombre.
ensuite à l'aide de l'opérateur modulo, tu peux choisir chaque partie de phrase afin de créer toutes les phrases une à une.
Dans ton cas tu à 4-4-6 parties variables donc une boucle de 0 à 4*4*6=96 (exclu)
pour la partie 1 tu divise ton itérateur par 4*6=24 et tu prends l'entier directement inférieure tu obtiens l'index de cette partie
pour la seconde, c'est pareil mais avec une division par 6
et le troisième c'est le modulo de ton itérateur par 6 qui t'apportera l'index de la partie 3

Reste à récupèrer la partie inchangé de la phrase et la position de chaque partie pour faire l'insertion à chaque itération et générer toutes tes phrases
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

15 avr. 2016, 14:10

Merci pour la réponse, mais comme dit dans mon post je débute et j'avoue que tu m'a un peu perdu...
Le problème est justement qu'il y aura toujours 3 parties variables mais qui ne comprendrons pas forcement le même nombre de mots.
Est-ce que dans ce cas la une fonction récursive peut s'appliquer?
J'avais aussi pensé a une imbrication de foreach mais je n'arrive pas a voir a quel endroit les placer...

Mammouth du PHP | 1967 Messages

15 avr. 2016, 14:22

Si le nombre de partie variable est fixe et connue, cela peut simplifier le problème.

Un imbrication de foreach fonctionnera très bien et sera plus simple qu'une fonction récursive
A la suite de ton code, juste après le print_r
Tu récupère chaque tableau séparement et tu boucle sur les 3 en 3 niveaux
foreach($tableau1 => $valeur1){
foreach($tableau2 => $valeur2){
foreach($tableau3 => $valeur3){
//Insèrer ici la concatènation des partie fixes et des $valeursX
}}}
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

15 avr. 2016, 14:25

Merci j'essai ça tout de suite!

Eléphanteau du PHP | 31 Messages

15 avr. 2016, 15:29

Désolé, c'est surement très bête et je suis surement très fatigué mais :
Le spining me génère 3 tableaux imbriqué dans un seul et du coup je n'arrive pas a récupérer mes tableaux...

Mammouth du PHP | 1967 Messages

15 avr. 2016, 15:40

$master_tableau = $spinning->results;
$tableau1 = $master_tableau[0];
$tableau2 = $master_tableau[1];
$tableau3 = $master_tableau[2];
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

15 avr. 2016, 15:57

On va mettre ça sur la fatigue... :)
Merci infiniment pour ton aide!

Eléphanteau du PHP | 31 Messages

15 avr. 2016, 16:06

J'abuse un peu, mais si finalement le nombre de variable vient a changer comment faire pour en faire un fonction récursive?

Mammouth du PHP | 1967 Messages

15 avr. 2016, 16:42

Finalement je conseille pas la fonction recursive.
en code non testé et écrit de mémoire
$master_tableau = $spinning->results;
$phrase_constante = array(0 => "J'ai");//Il faut créer ce tableau des parties constantes de ta phrase
$taille_tableaux = array();
foreach($master_tableau as $tableau) {
$taille_tableaux[] = sizeof($tableau);
}
for($i=0,$i< array_product($taille_tableaux),$i++) {
$remplacement = array();
foreach($taille_tableaux as $cle => $taille) {
$index = array_product(array_slice($taille_tableaux,$cle+1));
$remplacement[2*$cle+1] = $master_tableau[$cle][$index];
}
$phrase = array_merge($remplacement, $phrase_constante);
ksort($phrase);
$phrase = implode($phrase,'');
echo $phrase;
}
Le tableaux des constantes de ta phrase ne doit avoir que des index paires et dans l'ordre le début de la phrase, la partie entre les variable 1 et 2, la partie entre les variable 2 et 3, ... , la fin.
Je ne sais pas comment tu compte récupèrer les parties constantes, alors je te laisse cela en exercice
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

15 avr. 2016, 16:56

Merci encore!
Je vais tester ça.

Eléphanteau du PHP | 31 Messages

20 avr. 2016, 10:56

Re!
Merci encore pour l'aide, mais j'ai une erreur que je n'arrive pas a comprendre sur cette ligne :
$final_tab = $spinning->results;
            $tab = array();
            foreach ($final_tab as $all) {
                $tab[] = sizeof($all);
            }
            for ($i = 0; $i < array_product($tab); $i++) {
                $remplacement = array();
                foreach ($tab as $cle => $taille) {
                    $index = array_product(array_slice($tab, $cle + 1));
                    $remplacement[2 * $cle + 1] = $final_tab[$cle][$index];  <------------------------
                }
                $phrase = array_merge($remplacement);
                ksort($phrase);
                $phrase = implode($phrase, ' ');
                echo $phrase;
            }
Une idée?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

20 avr. 2016, 11:04

Bonjour,

Quelle est l'erreur ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 31 Messages

20 avr. 2016, 11:17

Bonjour!
Quand je teste avec cette phrase :
"J'ai {manger|croquer|jeté|fini} {les gâteaux|les bonbons|la tarte|le chien} {chez moi|chez toi|chez lui|chez nous|chez vous|chez le président}"
et que j'envoie il m'affiche :

Notice: Undefined offset: 24 in C:\ ... on line 56
Notice: Undefined offset: 6 in C:\ ... on line 56
chez toi

Je ne comprend pas pour quoi il m'indique 2 erreurs et m'affiche "chez toi"
Array (
[0] => Array ( [0] => manger [1] => croquer [2] => jeté [3] => fini )
[1] => Array ( [0] => les gâteaux [1] => les bonbons [2] => la tarte [3] => le chien )
[2] => Array ( [0] => chez moi [1] => chez toi [2] => chez lui [3] => chez nous [4] => chez vous [5] => chez le président )
)

Mammouth du PHP | 1967 Messages

20 avr. 2016, 11:26

Je suis parti du principe que ta phrase se structure comme ceci
[partie fixe][partie variable][partie fixe][partie variable]...
Les parties variables pouvant être vide.
les parties fixes ont donc un index 0,2, 4, ... soit les paires
Les parties variables ont les index 1, 3, 5, ... soit les impaires
Le code va donc créer un tableaux rien qu'avec des index impaires afin d'ensuite mélanger avec le tableaux des partie fixes (encore à créer) qui n'a que des index paires

Pour ton erreur, il faut peut être créer l'index avant de l'utiliser
$temp_cle = 2 * $cle + 1;
$remplacement[$temp_cle] = $final_tab[$cle][$index];
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube