Page 1 sur 2

Lire des tableaux de tableaux en boucle

Posté : 15 avr. 2016, 13:00
par psik4d3lik
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 ;)

Re: Lire des tableaux de tableaux en boucle

Posté : 15 avr. 2016, 13:21
par Spols
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

Re: Lire des tableaux de tableaux en boucle

Posté : 15 avr. 2016, 14:10
par psik4d3lik
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...

Re: Lire des tableaux de tableaux en boucle

Posté : 15 avr. 2016, 14:22
par Spols
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
}}}

Re: Lire des tableaux de tableaux en boucle

Posté : 15 avr. 2016, 14:25
par psik4d3lik
Merci j'essai ça tout de suite!

Re: Lire des tableaux de tableaux en boucle

Posté : 15 avr. 2016, 15:29
par psik4d3lik
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...

Re: Lire des tableaux de tableaux en boucle

Posté : 15 avr. 2016, 15:40
par Spols
$master_tableau = $spinning->results;
$tableau1 = $master_tableau[0];
$tableau2 = $master_tableau[1];
$tableau3 = $master_tableau[2];

Re: Lire des tableaux de tableaux en boucle

Posté : 15 avr. 2016, 15:57
par psik4d3lik
On va mettre ça sur la fatigue... :)
Merci infiniment pour ton aide!

Re: Lire des tableaux de tableaux en boucle

Posté : 15 avr. 2016, 16:06
par psik4d3lik
J'abuse un peu, mais si finalement le nombre de variable vient a changer comment faire pour en faire un fonction récursive?

Re: Lire des tableaux de tableaux en boucle

Posté : 15 avr. 2016, 16:42
par Spols
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

Re: Lire des tableaux de tableaux en boucle

Posté : 15 avr. 2016, 16:56
par psik4d3lik
Merci encore!
Je vais tester ça.

Re: Lire des tableaux de tableaux en boucle

Posté : 20 avr. 2016, 10:56
par psik4d3lik
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?

Re: Lire des tableaux de tableaux en boucle

Posté : 20 avr. 2016, 11:04
par @rthur
Bonjour,

Quelle est l'erreur ?

Re: Lire des tableaux de tableaux en boucle

Posté : 20 avr. 2016, 11:17
par psik4d3lik
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 )
)

Re: Lire des tableaux de tableaux en boucle

Posté : 20 avr. 2016, 11:26
par Spols
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];