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

Langage PHP Discussion :

[Tableaux] comment generer un nb indeterminé de boucles imbriquees? [Sources]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 19
    Points : 9
    Points
    9
    Par défaut [Tableaux] comment generer un nb indeterminé de boucles imbriquees?
    bonjour,

    voila, j'essaie de construire ttes les combinaisons possibles par exemple a partir de 3 nombres : i1 variant de 0 a 1, i2 de 0 a 1 et i3 de 0 a 1. Jusque la ca va ! j'ecris simplement trois boucles imbriquees
    for i1 { for i2 { for i3 {sprintf('%d%d%d',i1,i2,i3)}}}

    Mais c'est possible ds cet exemple car je sais a l'avance qu'il y a trois chiffres a faire varier. Le probleme c'est comment faire cela lorsque le nombre de chiffre devient un parametre? c-a-d qu'il n'est pas connu a l'avance ?? je ne peux pas ecrire autant de code que de posibilites pour un nombre a 1, 2, 3, 4,... 10 chiffres!?

    qqn aurait-il une idee pour m'aider?

    merci d'avance,

    @+

    noone.1

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    avec des include par exemple...

    pour un peu préciser : dans ta page principale tu fais un include du fichier qui contient une boucle for
    et à l'intérieur de cette boucle, tu appelles à nouveau via un include le même fichier...
    tu dois bien sûr gérer, avec un paramètre maxi, gérer une fin à ce nombre de include

  3. #3
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    pourquoi de 0 à 1 ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    de 0 a 1 c'est exemple, ca peut aussi etre des lettres

    sinon j'essaie en effet de m'en sortir avec une fonction recursive mais je ne comprends pas trop ton idee d'include...et surtout comment l'ecrire

    Pour donner plus de details, a l'aide d'un formulaire je recupere un format d'expression donne : par exemple on precise qu'il y a 4 parametres a faire varier et on rentre ' toto%1\$d%2\$d%3\$d%4\$s' ainsi que les domaines de variation pour les 4 param (min1, max1, ...). J'essaie alors d'afficher avec sprintf toutes les possibilites, du genre : toto000a,toto000b,toto001a,toto001b, ....
    le but etant de generer des expressions a un format donne

    ms je ne vois tjs pas...

    merci

  5. #5
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Ca ressemble à un problème de base ça.
    Jette un oeil sur cette fonction, ainsi que sur les commentaires associés =>
    http://fr.php.net/manual/fr/function.base-convert.php

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    je te remercie mais non pas du tout, je ne veux rien convertir, juste generer des expressions qcq correspondant a un format donne avec des parametres variant dans un domaine donne...
    le pb c'est que ce sont des donnees utilisateur, non connu a l'avance, ca peut etre %d variant de 3 a 7 ou %s%d le 1er variant de d a f et le 2eme de 1 a 2....

  7. #7
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    Je crois qu'il faut découper le probleme.

    1) la construction de la liste des possibilitées

    Voyons ce que tu peux avoir en entrée :
    * Un tableau des champs dont il faut trouver les combinaisons

    Le tableau pourrait etre de la forme (par exemple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array(array('min'=>1, 'max=>'3'), array('min'=>0, 'max'=>'1'));
    ce qui correspondrait a 2 parametres, le premier variant de 1 a 3 et le second de 0 a 1

    En sortie de ta fonction, tu cherches a obtenir toutes les combinaisons pour un parametre donné. Comme tu as plusieurs parametres, il aura un tableau de combinaisons possibles.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array(array(1,2,3), array(0,1));
    devra etre le resultat pour les parametres d'entrées au dessus.

    Tu peux faire ca sans récursivité, 2 boucles for suffisent.

    2) la construction de toutes les possibilitées

    Là, tu as un tableau contenant des tableaux contenant des listes de possibilitées. Donc, tu doit pouvoir générer un tableau contenant la combinaison de toutes les possibilités
    Toujours avec le meme exemple, ca donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array(array(1, 0), array(1, 1), array(2, 0), array(2, 1), array(3, 0), array(3, 1));
    Tu doit toujours pouvoir faire ca avec 2 ou 3 boucles for.

    3) le formatage

    Maintenant que tu as la liste de toutes les possibilités, tu peux appliquer la chaine de format sur toutes les possibilités.
    Donc une seule boucle for.

    Tu devrait pouvoir t'en sortir avec ca. Une fois que tu as réussi a avoir un code qui marche, tu pourra essayer de reduire le code en fusionnant l'étape 1 et l'étape 2 (ca doit etre possible ;o) et tu y verras plus clair si tu souhaite faire une solution récursive.

  8. #8
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Ca aurait été de la conversion si chaque caractère possèdait le même alphabet.
    Imagine que tu veux générer une chaine de taille n
    Tu as besoin de n alphabets (1 pour chaque caractère de ta chaine)
    Le nombre de combinaison possible sera apparemment, si je calcule bien, de :

    nb_comb = taille(alphabet[1])*taille(alphabet[2])*...*taille(alphabet[i])*...*taille(alphabet[n])

    donc :
    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
    23
    24
    25
    26
    27
    28
    29
     
    nb_comb = 1
    tableau = array
    pour i allant de 1 à n faire
       tableau[i] = array
       nb_comb = nb_comb*taille(alphabet[i])
    finfaire
     
    pour i allant de 1 à n faire
       repetitions = 1
       pour j allant 1 à i-1 faire
          repetitions = repetitions * taille(alphabet[j])
       finfaire
     
       pour k allant de 1 à nb_comb/taille(alphabet[i]) faire
          pour ii allant de 1 à taille(alphabet[i]) faire
             pour l allant de 1 à repetitions faire
                tableau[i][] = alphabet[i][k]
             finfaire
          finfaire
       finfaire
    finfaire
     
    pour m allant de 1 à nb_comb faire
       pour i allant de n à 1 faire
          affiche tableau[i][m]
       finfaire
       affiche_nouvelle_ligne
    finfaire
    Quelqu'un pour implementer ceci afin de voir si ca marche ?

  9. #9
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    A y est
    Après quelques correction de l'algo ci-dessus voilà le code php correspondant :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <pre><?php
    	$alphabet   = array();
    	$alphabet[] = array('|', '/', '-', '\\');
    	$alphabet[] = array('0', '1', '2');
    	$alphabet[] = array('a', 'b');
    	$alphabet[] = array('X', 'Y', 'Z');
     
    	$n = count($alphabet);
     
    	$nb_comb = 1;
    	$tableau = array();
    	for ($i = 0 ; $i < $n ; $i++) {
    		$tableau[$i] = array();
    		$nb_comb = $nb_comb*count($alphabet[$i]);
    	}
    	for ($i = 0 ; $i < $n ; $i++) {
    		$repetitions = 1;
    		for ($j = 0 ; $j < $i ; $j++) {
    			$repetitions = $repetitions * count($alphabet[$j]);
    		}
       		for ($k = 0 ; $k < $nb_comb/count($alphabet[$i]) ; $k++) {
    			for($i_i = 0 ; $i_i < count($alphabet[$i]) ; $i_i++) {
    				for ($l = 0 ; $l < $repetitions ; $l++) {
    					$tableau[$i][] = $alphabet[$i][$i_i];
    				}
          			}
    		}
    	}
     
    	for ($m = 0 ; $m < $nb_comb ; $m++) {
    		for ($i = $n - 1 ; $i >= 0 ; $i--) {
    			echo $tableau[$i][$m];
    		}
    		echo "\n";
    	}
    ?></pre>
    Ce qui donne
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    Xa0|
    Xa0/
    Xa0-
    Xa0\
    Xa1|
    Xa1/
    Xa1-
    Xa1\
    Xa2|
    Xa2/
    Xa2-
    Xa2\
    Xb0|
    Xb0/
    Xb0-
    Xb0\
    Xb1|
    Xb1/
    Xb1-
    Xb1\
    Xb2|
    Xb2/
    Xb2-
    Xb2\
    Ya0|
    Ya0/
    Ya0-
    Ya0\
    Ya1|
    Ya1/
    Ya1-
    Ya1\
    Ya2|
    Ya2/
    Ya2-
    Ya2\
    Yb0|
    Yb0/
    Yb0-
    Yb0\
    Yb1|
    Yb1/
    Yb1-
    Yb1\
    Yb2|
    Yb2/
    Yb2-
    Yb2\
    Za0|
    Za0/
    Za0-
    Za0\
    Za1|
    Za1/
    Za1-
    Za1\
    Za2|
    Za2/
    Za2-
    Za2\
    Zb0|
    Zb0/
    Zb0-
    Zb0\
    Zb1|
    Zb1/
    Zb1-
    Zb1\
    Zb2|
    Zb2/
    Zb2-
    Zb2\
    Des questions ?

  10. #10
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    pas besoin de "construire" un alphabet si on utilise l'operateur d'incrementation :

    http://fr.php.net/manual/fr/language....increment.php

    Ainsi, on apprend que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $var='a';
    for ($i = 0; $i<26; $i++) {
    echo $var++;
    }
    va afficher


  11. #11
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pas besoin de "construire" un alphabet
    Et comment tu gère cet alphabet là ?
    Ou encore celui là ?
    Ou encore... Bref la liste est longue.
    Donc tu peux en effet "construire" un alphabet avec une incrémentation mais tu ne pourras pas gérer tous les cas de figure...

  12. #12
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    oui, mais il ne parle nulle part de cas particuliers comme ca ;o)

    j'ai deja tendance a me compliquer la vie dans mes scripts (perfectionnisme quand tu nous tiens...) mais là y a pas de raisons.

    Et pis dans le cas ou ca serait pertinent, je prefererais partir de qqchose comme ca :
    alphabet = "aeiouy";

    plus simple a maintenir que array('a', 'e', 'i', 'o', 'u', 'y');

    en accedant a chaque lettre avec $alphabet{$i}

  13. #13
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    +1

    même si j'ai du mal avec la syntaxe particulière à php d'acceder aux caractères d'une string, je convient que c'est plus simple

    Par contre, "qui peut le plus peut le moins" donc je n'exclus pas 'aeiouy'... Et de toutes façons ca ne change pas grand chose au problème.

    Voici donc le script corrigé en conséquence =>
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    <pre><?php
    	$alphabet   = array();
    	$alphabet[] = '|/-\\';
    	$alphabet[] = '012';
    	$alphabet[] = 'ab';
    	$alphabet[] = 'XYZ';
     
    	$n = count($alphabet);
     
    	$nb_comb = 1;
    	$tableau = array();
    	for ($i = 0 ; $i < $n ; $i++) {
    		$tableau[$i] = array();
    		$nb_comb = $nb_comb*strlen($alphabet[$i]);
    	}
    	for ($i = 0 ; $i < $n ; $i++) {
    		$repetitions = 1;
    		for ($j = 0 ; $j < $i ; $j++) {
    			$repetitions = $repetitions * strlen($alphabet[$j]);
    		}
       		for ($k = 0 ; $k < $nb_comb/strlen($alphabet[$i]) ; $k++) {
    			for($i_i = 0 ; $i_i < strlen($alphabet[$i]) ; $i_i++) {
    				for ($l = 0 ; $l < $repetitions ; $l++) {
    					$tableau[$i][] = $alphabet[$i]{$i_i};
    				}
          			}
    		}
    	}
     
    	for ($m = 0 ; $m < $nb_comb ; $m++) {
    		for ($i = $n - 1 ; $i >= 0 ; $i--) {
    			echo $tableau[$i][$m];
    		}
    		echo "\n";
    	}
    ?></pre>

  14. #14
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Je viens de constater un bug dans mon script au niveau de l'affichage
    je n'affichais pas dans le meme ordre que les alphabets ! (du à mon modèle mental sur la représentation binaire)

    Voilà un enieme fix :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <pre><?php
    	$alphabet   = array();
    	$alphabet[] = '|/-\\';
    	$alphabet[] = '012';
    	$alphabet[] = 'ab';
    	$alphabet[] = 'XYZ';
     
    	$n = count($alphabet);
     
    	$nb_comb = 1;
    	$tableau = array();
    	for ($i = 0 ; $i < $n ; $i++) {
    		$tableau[$i] = array();
    		$nb_comb = $nb_comb*strlen($alphabet[$i]);
    	}
    	for ($i = 0 ; $i < $n ; $i++) {
    		$repetitions = 1;
    		for ($j = 0 ; $j < $i ; $j++) {
    			$repetitions = $repetitions * strlen($alphabet[$j]);
    		}
       		for ($k = 0 ; $k < $nb_comb/strlen($alphabet[$i]) ; $k++) {
    			for($i_i = 0 ; $i_i < strlen($alphabet[$i]) ; $i_i++) {
    				for ($l = 0 ; $l < $repetitions ; $l++) {
    					$tableau[$i][] = $alphabet[$i]{$i_i};
    				}
          			}
    		}
    	}
     
    	for ($m = 0 ; $m < $nb_comb ; $m++) {
    		for ($i = 0 ; $i < $n ; $i++) {
    			echo $tableau[$i][$m];
    		}
    		echo "\n";
    	}
    ?></pre>

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    hi men!

    - merci pour tous vos efforts, meme si je ne suis pas convaincu que cela reponde a mon pb de depart ;-)

    -j'ai vu une question plus haut sur commun generer n'importe quel type de caractere : pourquoi ne pas utiliser des boucles sur les codes ascii, tu pourras meme generer des caracteres en sanscrit si tu as installe la police sur ton pc ;-)

    - bon, a part ca j'ai resolu mon pb. ce qui me bloquait c'etait de vouloir utiliser une fct sprintf qui ne peut pas prendre un tableau de valeur en argument. Du coup en essayant d'en creer une je me suis rendu compte qu'une expression reguliere serait plus simple combine a une fuckin' fct recursive que j'ai fini par trouver.

    Alors comme vous avez ete sympa de vous interesser a ce post, je balance le code, avec le petit formulaire qui rend tout ca plus sympathique! ;-)

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    genstr.php
    /********************************************************/
    <?php $locadr= 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']; ?>
    <script language="javascript" type="text/javascript">
    function showhide_tot(divid){
    if ( document.getElementById && document.getElementById(divid) ) {pdiv=document.getElementById(divid).style;}
    	else if ( document.all && document.all[divid] ) {pdiv=document.all[divid].style;}
    	else if ( document.layers && document.layers[divid] ) {pdiv=document.layers[divid].style;}
    pdiv.visibility= (pdiv.visibility=="hidden")?"visible":"hidden";
    pdiv.display=(pdiv.display=="none")?"inline":"none";}</script>
     
    <div id="genurl" style="background-color:#595b70;">
    	<p><a href="javascript:showhide_tot('gnform');showhide_tot('resgen');">Gen URL</a></p>
    	genere chaines de caracteres
    	<br /><br />
     
    	<?php /*format de la chaine a generer: 3 nb et un car. pr donner un exemple*/
    	$gnurl="http://www.toto.fr/index.html/%1\$d%2\$d%3\$d%4\$s";
    	$vis="visibility:visible;display:block;";$nonvis="visibility:hidden;display:none;";
    	$gnform_vis=empty($_POST['gnsubmit'])?$vis:$nonvis;$gn_vis=empty($_POST['gnsubmit'])?$nonvis:$vis;
    	?>
     
    	<div id="gnform" style="border: 1px #ffcc00 solid;margin-left:10px;<?php echo $gnform_vis;?>">
     
    	<?php if (empty($_POST['npsubmit'])) { ?>
     
    	<form name="npform" action="<?php echo $locadr ?>" method="post" enctype="multipart/form-data">
    	nb de param variables dans l'expression:<input name="npar" type="text" value="4" size="1" />
    	<input name="npsubmit" type="submit" value="Ok" />
    	</form>
     
    	<?php } else { $npar=$_POST['npar']; ?>
     
    	<form name="Form3" action="<?php echo $locadr ?>" method="post" enctype="multipart/form-data">
    		format de la chaine<input name="gnurl" type="text" value="<?php echo $gnurl ?>" size="50" /><br />
    		(les numeros doivent correspondrent a l'emplacement des param. ds la chaine cf <a href="http://fr2.php.net/manual/fr/function.sprintf.php">sprintf)</a>
    		<br /><br />variation des parametres:<br />
    		<?php for ($np=1;$np<=$npar;$np++){
    			print "par $np : min/max <input name=\"min$np\" type=\"text\" value=\"0\" size=\"1\" />";
    			print "<input name=\"max$np\" type=\"text\" value=\"1\" size=\"1\" /><br />";}
    		?> 
    		<br />
    		<input name="clear" type="reset" value="Clear" onClick="document.forms.Form3.reset()"/>
    		<input name="gnsubmit" type="submit" value="Ok" />
    	</form>
     
    	<?php } ?>
     
    	</div>
     
    	<div id="resgen" style="<?php echo $gn_vis;?>"><br />
    		<?php
     
    	if(!empty($_POST['gnsubmit'])){/*verif click on submit*/
    		if (!empty($_POST['gnurl'])){/*verif string send*/
    			foreach ($_POST as $k => $v) {$$k=$v;} /*cree $min1=min1, .... et $gnurl*/
    		}
     
    	$npar=(count($_POST)-2)/2;
    	for ($i=1;$i<=$npar;$i++){global ${'i'.$i};
    		for($ni=${'min'.$i};$ni<=${'max'.$i};$ni++){${'par'.$i}[]=$ni;}/*stock les val possibles des param*/
    	}
     
    	/*simulation de la fct sprintf*/
    	$pattern='/[%]\d[\\][$]\w/';preg_match_all($pattern,$gnurl,$matches);/*repere l'emplacement des car. de formatage*/
    	/*repere l'ordre de placement des param (si le 1er par. apparait en 3eme pos. etc...)*/
    	$ord[0]=0;for ($i=1;$i<=$npar;$i++){$ord[$i]=substr($matches[0][$i-1],1,1);}
     
    	function array_dot($t1,$t2){/*fait le produit de ts les elem de 2 tab. */
    		foreach ($t1 as $v1){foreach ($t2 as $v2){$t3[]=$v1.",".$v2;}}
    	return $t3;}
     
    	$i=1;while ($i<$npar-1){/*applique recursivement f(f(f(tab1,tab2),tab3),tab4)...*/
    		$j=$i+1;$k=$i+2;
    		global $ord;
    		global ${'par'.$ord[$i]},${'par'.$ord[$j]},${'par'.$ord[$k]};
    		if ($i==1) {$tab=array_dot(${'par'.$ord[$i]},${'par'.$ord[$j]});}
    		$tab=array_dot($tab,${'par'.$ord[$k]});
    	$i++;}
     
    	$pattern=$matches[0];
    	for ($i=1;$i<=count($tab)-1;$i++){
    		$replace=explode(',',$tab[$i]);
    	print "<br />".str_replace($pattern,$replace,$gnurl);}
     
    	}?>	
    	<br /><br />cliquez sur le lien pour recommencer
    	</div>
    <br /><br />
    </div>
     
    /*********************************************************/
    voila, c'est clair que ca doit pouvoir s'ameliorer et etre rendu plus compact mais si ca peut servir, c'est tant mieux! l'interet est de generer n'importe quel car. n'importe ou ds une expression

    @+

    noone.1

  16. #16
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Il marche pas ton script ^^
    J'ai donné les parametres suivants :
    0 à 4
    0 à 3
    a à b
    0 à 4

    il ne m'a pas sorti la combinaison suivante :
    00a0

    Game over. Même joueur essaye encore

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    ok, bien vu, c'est juste a l'affichage :

    ds la derniere boucle remplacer 1 par 0 ! :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	for ($i=0;$i<=count($tab)-1;$i++){
    		$replace=explode(',',$tab[$i]);
    	print "<br />".str_replace($pattern,$replace,$gnurl);}
    8)

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    derniere correction : ne marchait pas avec 1 seul parametre de plus une boucle de 'a' a 'z' en php genere a..z ms aussi aa,ab...zz d'ou la version corrigee (a remplacer ds le script plus haut):

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    	<div id="resgen" style="<?php echo $gn_vis;?>"><br />
    	<?php
     
    	if(!empty($_POST['gnsubmit'])){/*verif click on submit*/
    		if (!empty($_POST['gnurl'])){/*verif string send*/
    			foreach ($_POST as $k => $v) {$$k=$v;}/*cree $min1=min1, .... et $gnurl*/
    	$npar=(count($_POST)-2)/2;
    	$pattern='/[%]\d[\\][$]\w/';preg_match_all($pattern,$gnurl,$matches);/*repere l'emplacement des car. de formatage*/
    	if (count($matches[0]) != $npar) {exit("il manque des valeurs");}
    	/*repere l'ordre de placement des param (si le 1er par. apparait en 3eme pos. etc...)*/
    	$ord[0]=0;for ($i=1;$i<=$npar;$i++){$ord[$i]=substr($matches[0][$i-1],1,1);}
     
    	for ($i=1;$i<=$npar;$i++){global ${'par'.$i};/*stock les val possibles des param*/
    	for($ni=ord(${'min'.$i});$ni<=ord(${'max'.$i});$ni++){${'par'.$i}[]=chr($ni);}}
     
    	function array_dot($t1,$t2){/*fait le produit de ts les elem de 2 tab. */
    		foreach ($t1 as $v1){foreach ($t2 as $v2){$t3[]=$v1.",".$v2;}}
    	return $t3;}
     
    	if ($npar==1){global $par1;
    		for ($i=$par1[0];$i<=$par1[count($par1)-1];$i++){$tab[]=$i.",";}
    	}elseif ($npar==2){global $ord,$par1,$par2;
    		$tab=array_dot(${'par'.$ord[1]},${'par'.$ord[2]});//array_show($tab);
    	}else{
    		for ($i=1;$i<$npar-1;$i++){$j=$i+1;$k=$i+2;
    			global $ord;
    			global ${'par'.$ord[$i]},${'par'.$ord[$j]},${'par'.$ord[$k]};
    			if ($i==1) {$tab=array_dot(${'par'.$ord[$i]},${'par'.$ord[$j]});}
    	$tab=array_dot($tab,${'par'.$ord[$k]});}}
     
    	$pattern=$matches[0];
    	for ($i=0;$i<=count($tab)-1;$i++){
    		$replace=explode(',',$tab[$i]);
    		$uri=str_replace($pattern,$replace,$gnurl);
    	print "<br />".$uri;}
    	}}?>	
    	</div>
    @+,noone.1

  19. #19
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    C'est quand même assez illisible

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/11/2010, 08h30
  2. Réponses: 7
    Dernier message: 14/02/2006, 16h55
  3. Comment generer un fichier war dans java
    Par relivio dans le forum ANT
    Réponses: 4
    Dernier message: 12/03/2004, 13h43
  4. Réponses: 14
    Dernier message: 01/09/2003, 22h46
  5. [VB.Net] Comment generer une page html dynamiquement ?
    Par Anonymous dans le forum ASP.NET
    Réponses: 3
    Dernier message: 13/03/2003, 10h22

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