Trouver toutes les combinaisons possibles d'une chaine ????

Résolu
cs_fabiano13 Messages postés 262 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 27 février 2012 - 3 avril 2006 à 14:38
cs_fabiano13 Messages postés 262 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 27 février 2012 - 6 avril 2006 à 18:29
Je bloc, pouvez-vous m'aider !


Grâce à l'aide de DB77, j'ai le script "1er EXEMPLE" qui permet de reconstruire un tableau avec toutes les combinaisons possibles de plusieurs chaines.


Je voudrai l'adapter ainsi : (voir le script 2eme exemple)


J'aurai qu'une seule chaine contenant toutes les options.


La dificulté c'est que je ne connais pas par avance le nom, ni le nombre de produits choisies et ni le nombres d'options choisies


Elles seront imbriquées de la manière suivantes :


var sRequette = "'Domicile'|'XXL'^'XL'^'L'^'M'^'S'|'Oui'^'Non'#'Extérieur'|'XXL'^'M'^'S'|'Oui'^'Non'"


1) le " # " est le séparateur des produits
2) le " | " est le séparateur des options
3) le " ^ " est le séparateur des choix des options


Pour cette exemple on aurai se résultat :
1) Domicile => XXL - XL - L - M - S => Oui - Non
2) Extérieur => XXL - M - S => Oui - Non


Le résultat final serai :


1er Tableau :
Domicile - XXL - Oui
Domicile - XXL - NON
Domicile - XL - Oui
Domicile - XL - NON
Domicile - L - Oui
Domicile - L - NON
Domicile - M - Oui
Domicile - M - NON
Domicile - S - Oui
Domicile - S - NON


2emeTableau :
Extérieur - XXL - Oui
Extérieur - XXL - NON
Extérieur - M - Oui
Extérieur - M - NON
Extérieur - S - Oui
Extérieur - S - NON


L'idée c'est qu'en amont je construis dynamiquement les objets (new array) et les instructions (boucle du type for) qui seront ensuite utilisées à construire mes tableaux.


J'ai une erreur du type "variable indéfini" !


Pouvez vous m'aider ?
Si non, est qu'il y a une autre méthode que celle-ci ?


Je vous en remercie par avance.
Cordialement,
Fabiano13


//////////////////////////////////////////// 1er EXEMPLE ////////////////////////////////////////////

<script language="javascript">
var Tag = "";
c1=new Array("Domicile");
c2=new Array("XXL","XL","L","M","S");
c3=new Array("Oui","Non");


Tag = "\"
for(i=0;i<c1.length;i++){
for(j=0;j<c2.length;j++){
for(k=0;k<c3.length;k++){
Tag += \"----
" + c1[i] + ", " + c2[j] + ", " + c3[k] + ", \"
}}}
Tag += "

"


</script>
&nbsp;

<script>
document.getElementById("ici").innerHTML = Tag
</script>
&quot;Domicile;XXL~XL~L~M~S;Oui~Non|Domicile;XXL~M~S;Oui~Non"

</html>


//////////////////////////////////////////// Fin 1er EXEMPLE ////////////////////////////////////////////



//////////////////////////////////////////// 2eme EXEMPLE ////////////////////////////////////////////

<script language="javascript">
var Tag = "";
var sRequette = "'Domicile'|'XXL'^'XL'^'L'^'M'^'S'|'Oui'^'Non'#'Extérieur'|'XXL'^'M'^'S'|'Oui'^'Non'"
var sReqSuite = sRequette.split("#")
for(i=0;i<sReqSuite.length;i++){
eval("var NvArray" + i + " = sReqSuite[" + i + "].split("|")")
}
var NbRequette = sReqSuite.length
QZ = new Array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")
sD = 0;
sForDepart = "";


for(w=0;w<NbRequette;w++){
var NbSubReq = eval("NvArray" + w + ".length")
for(d=0;d<NbSubReq;d++){
sg = eval("NvArray" + w + "["+ d +"].split("^")")
eval("c" + sD + "= new Array(" + sg + ")") // Objets du type new array
if (d==0){
eval("sForDepart" + w + "= " for(" + QZ[sD] + "=0;" + QZ[sD] + "<c" + sD + ".length;" + QZ[sD] + "++){ "") // 1er chaine instruction boucle du type for
eval("sForFin" + w + " = "}" ") //1er fin de chaine boucle
eval("sTDTag" + w + " = "<td>"+" + "c" + sD + "[" + QZ[sD] + "]" + "+"</td>"") // 1er chaine éléments c0[a] + c1[b] + c2[c] (les lettres a,b,c... sont les variables de la boucle)
}else{
eval("sForDepart" + w + "+= " for(" + QZ[sD] + "=0;" + QZ[sD] + "<c" + sD + ".length;" + QZ[sD] + "++){ "") // Suite chaines instructions boucle du type for
eval("sForFin" + w + " += "}" ") //Suite et fin chaine boucle
eval("sTDTag" + w + " += "<td>"+" + "c" + sD + "[" + QZ[sD] + "]" + "+"</td>"") // suite chaine éléments c0[a] + c1[b] + c2[c]
}
sD++
}
}


for(w=0;w<NbRequette;w++){
var NbSubReq = eval("NvArray" + w + ".length")
Tag += "\"
eval(eval(\"sForDepart\" + w) + \" Tag += \\"----
\" + eval(\"sTDTag\" + w) + \"\\" \" + eval(\"sForFin\" + w) ) // ici on récupère les chaines boucles + les chaines éléments avec les variables boucles
Tag += "

"
}


</script>


&nbsp;


<script>
document.getElementById("ici").innerHTML = Tag
</script>

//////////////////////////////////////////// Fin 2eme EXEMPLE ////////////////////////////////////////////

5 réponses

PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
5 avril 2006 à 07:53
Bonjour...

Après avoir planché un peu sur ton problème je te livre un script, orienté objet mais pas trop, j'espère qu'il te satisfera...

C'est parti...

<SCRIPT language= "javascript">
var sRequette = new String( "'Domicile'|'XXL'^'XL'^'L'^'M'^'S'|'Oui'^'Non'#'Extérieur'|'XXL'^'M'^'S'|'Oui'^'Non'");

var Tab = new Array(); // Tableau des Résulats
var Sep = new Array('#', '|', '^'); // Liste Séparateurs

//-----------------------
function Reference( txt_){
var Ind;
var Pos;
var i = 1;
//-- On garde la ligne entière
this.Ligne = new String(txt_);

//-- Recherche Position début des Champs
this.PosSep = new Array( 0, -1, -1);
while(( Pos = this.Ligne.indexOf( Sep[1], Ind)) > -1 ){
Ind = Pos +1;
this.PosSep[i ++] = Ind;
}

//-- On affecte le produit
if( this.PosSep[1] > -1)
this.Produit = this.Ligne.substring( 0, this.PosSep[1]-1);

this.Option = new Array();
this.Choix = new Array();

//-- Les fonctions de récupération
this.RecupOption = RecupOption;
this.RecupChoix = RecupChoix;
}

//--------------------
function RecupOption(){
var szTmp;
var i = 0;
var Ind = 0;
var Pos = 0;
with( this){
szTmp = Ligne.substring( PosSep[1], PosSep[2]-1);
szTmp += Sep[2]; // pour prendre en compte le dernier

//-- Recherche des champs Option
while(( Pos = szTmp.indexOf( Sep[2], Ind)) > -1 ){
Option[i] = szTmp.substring( Ind, Pos);
Ind = Pos +1;
i++;
}
}
}

//--------------------
function RecupChoix(){
var szTmp;
var i = 0;
var Ind = 0;
var Pos = 0;
with( this){
szTmp = Ligne.substring( PosSep[2], Ligne.length);
szTmp += Sep[2]; // pour prendre en compte le dernier

//-- Recherche des champs Choix
while(( Pos = szTmp.indexOf( Sep[2], Ind)) > -1 ){
Choix[i] = szTmp.substring( Ind, Pos);
Ind = Pos +1;
i++;
}
}
}

//---------------------------
function DecodRequette( txt_){
var i;
var Ind = 0; // Index recherche Séparateur
var Pos = 0; // Index Position tableau de résultat
txt_ += Sep[0]; // pour être sur de prendre en compte le dernier

//-- Récupération des Produits
while(( PosSep = txt_.indexOf( Sep[0], Ind)) > -1 ){
Tab[Pos] = new Reference( txt_.substring( Ind, PosSep));
Tab[Pos].RecupOption();
Tab[Pos].RecupChoix();
Pos++;
Ind = PosSep +1;
}

//-- Affichage Html " Chaine Traitée " +txt_ +'
';
Html += ''
Html += '----
';
Html += 'Produit, ';
Html += 'Option, ';
Html += 'Choix, ';

for( i =0; i <Tab.length; i++){
for( j =0; j <Tab[i].Option.length; j++){
for( k =0; k <Tab[i].Choix.length; k++){
Html += '----
';
Html += '' + Tab[i].Produit + ', ';
Html += '' + Tab[i].Option[j] + ', ';
Html += '' + Tab[i].Choix [k] + ', ';
Html += '';
}
}
}
Html += '
';
document.write( Html);
}

//===================//
// Appel Fonction //
//===================//
//-- Suppression des '
var Chaine = sRequette.replace(/'/gi, "");
DecodRequette( Chaine);

</SCRIPT>

A toi de finir de l'adapter...Bonne PROG !

;0)
3
cs_fabiano13 Messages postés 262 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 27 février 2012
5 avril 2006 à 09:37
Bonjour PetoleTeam,

Avant tout je te remercie de m'avoir aidé sur ce problème.

J'ai encore une petite question. J'ai fait un script qui marche sans problème, mais je veux quand même ton avis. Car ta méthode d'application, je la préfère à la mienne.

Voila je t'explique;

Selon les cas de figure, le nombre d'option change en fonction des fiches produits !
Mais c'est l'utilisateur de l'application qui va mettre les options et les choix d'options !
Si tu m'as compris, alors tu peux comprendre la suite.

Donc, pour cette exemple les options sont : Type | Taille | Flocage

La chaine qui va être traité est :

var sRequette = new String( "'Domicile'|'XXL'^'XL'^'L'^'M'^'S'|'Oui'^'Non'#'Extérieur'|'XXL'^'M'^'S'|'Oui'^'Non'")

Type,
Taille,
Flocage,
----

Domicile,
XXL,
Oui,
----

Domicile,
XXL,
Non,
----

Domicile,
XXL,
Clo,
----

Domicile,
XL,
Oui,
----

Domicile,
XL,
Non,
----

Domicile,
XL,
Clo,
----

Domicile,
L,
Oui,
----

Domicile,
L,
Non

En la décomposant on aura donc :

1er produit :
Type : Domicile
Taille : XXL , XL , L , M , S
Flocage : Oui , Non

2eme produit :
Type : Extérieur
Taille : XXL , M , S
Flocage : Oui , Non

Jusqu'ici tu devrais me comprendre !

Mais dans d'autre cas de figure tu pourrais non plus avoir 3 options (Type | Taille | Flocage) mais (Type | Flocage) ou (Type) ou même (Type | Taille | flocage | couleur | Matière...). Les Options peuvent varier en fonction du produit. Ici on parle de maillot de Foot, mais s'ils veulent vendre des meubles, il y aurai d'autre critère "Options" ! Tout ceci pour déterminer les stocks et les références. Plus il y aura de critère "Options" plus la chaine sera longue, je sais !!! Mais pour l'instant ça ne leur dérange pas de gérer la chose ainsi.

4eme exemple : la chaine a traiter serai donc :
var sRequette = new String( "'Domicile'|'XXL'^'XL'^'L''Oui'^'Non'|'Rouge'^''Vert'^'Bleu'|'Coton'^''Acrylique'#'Extérieur'|'XXL'^'M'^'S'|'Oui'^'Non'")

Type : Domicile
Taille : XXL , XL , L , M , S
Flocage : Oui , Non
Couleur : Rouge , Vert , Bleu
Matière : Coton , Acrylique


Type,
Taille,
Flocage,
Couleur,
Matière,
----

Domicile,
XXL,
Oui,
Rouge,
Coton,
----

Domicile,
XXL,
Oui,
Rouge,
Acrylique,
----

Domicile,
XXL,
Oui,
Vert,
Coton,
----

Domicile,
XXL,
Oui,
Vert,
Acrylique,
----

Domicile,
XXL,
Oui,
Bleu,
Coton,
----

Domicile,
XXL,
Oui,
Bleu,
Acrylique,
----

Domicile,
XXL,
Non,
Rouge,
Coton,
----

Domicile,
XXL,
Non,
Rouge,
Acrylique,
----

Domicile,
XXL,
Non,
Vert,
Coton,
----

Domicile,
XXL,
Non,
Vert,
Acrylique,
----

Domicile,
XXL,
Non,
Bleu,
Coton,
----

Domicile,
XXL,
Non,
Bleu,
Acrylique,
----

Domicile,
XL,
Oui,
Rouge,
Coton,
----

Domicile,
XL,
Oui,
Rouge,
Acrylique,
----

Domicile,
XL,
Oui,
Vert,
Coton,
----

Domicile,
XL,
Oui,
Vert,
Acrylique



Voci mon script qui le gère. Il n'est pas très beau, mais il marche.
Ce que je voudrai savoir si ton script peut être adapter pour faire la même chose que celui-ci ?

<script language="javascript">
var Tag = "";
var sRequette = "'Domicile'|'XXL'^'XL'^'L'|'Oui'^'Non'|'Rouge'^'Vert'|'Coton'^'Acrylique'#'Extérieur'|'XXL'^'M'^'S'|'Oui'^'Non'|'Rouge'^'Bleu'|'Coton'^'Acrylique'"
var sReqSuite = sRequette.split("#")
for(i=0;i<sReqSuite.length;i++){
eval("var NvArray" + i + " = sReqSuite[" + i + "].split("|")")
}
var NbRequette = sReqSuite.length
QZ = new Array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")
sD = 0;
sForDepart = "";
for(w=0;w<NbRequette;w++){
var NbSubReq = eval("NvArray" + w + ".length")
for(d=0;d<NbSubReq;d++){
sg = eval("NvArray" + w + "["+ d +"].split("^")")
eval("c" + sD + "= new Array(" + sg + ")")
if (d==0){
sForDepart = eval(""for(" + QZ[sD] + "=0;" + QZ[sD] + "<c" + sD + ".length;" + QZ[sD] + "++){ "")
sForFin = eval(""}"")
sTDTag = "<td>" + c" + sD + "[" + QZ[sD] + "] + "</td>"
}else{
sForDepart += eval(""for(" + QZ[sD] + "=0;" + QZ[sD] + "<c" + sD + ".length;" + QZ[sD] + "++){ "")
sForFin += eval(""}"")
sTDTag += "<td>" + c" + sD + "[" + QZ[sD] + "] + "</td>"
}
sD++
}
eval("sForDepart" + w + " = sForDepart")
eval("sForFin" + w + " = sForFin")
eval("sTDTag" + w + " = sTDTag")
}


for(w=0;w<NbRequette;w++){
var NbSubReq = eval("NvArray" + w + ".length")
Tag += "\"
eval(eval(\"sForDepart\" + w) + \" Tag += \\"----
\" + eval(\"sTDTag\" + w) + \"\\" \" + eval(\"sForFin\" + w) )
Tag += "
"
}


</script>


&nbsp;


<script>
document.getElementById("ici").innerHTML = Tag
</script>
3
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
5 avril 2006 à 17:23
Bonjour...

Le script peut s'adapter...après quelques modifications...

Je te rendrai la copie sous peu, si j'ai un peu plus de temps à consacrer au Forum...Le défi est lancé

;0)
3
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
6 avril 2006 à 17:05
Bonjour...

Ce n'est pas très pointu mais voila le résultats d'une rapide adaptation...
En lisant ce qui suit te verra rapidement les modifications à faire si tu as de champs supplémentaire...
La fonction d'affichage est à Ch..r mais bon je reste perçuadé que tu devrait t'en sortir...

//-----------------------
function Reference( txt_){
var Ind;
var Pos;
var i = 1;
//-- On garde la ligne entière
this.Ligne = new String(txt_);
this.Ligne += Sep[1]; // Pour prise en compte final

//-- Recherche Position début des Champs
this.PosSep = new Array( 0, -1, -1, -1, -1, -1, -1);

while(( Pos = this.Ligne.indexOf( Sep[1], Ind)) > -1 ){
Ind = Pos +1;
this.PosSep[i++] = Ind;
}

//-- On affecte le produit
if( this.PosSep[1] > -1)
this.Produit = this.Ligne.substring( 0, this.PosSep[1]-1);

this.Champ_1 = new Array();
this.Champ_2 = new Array();
this.Champ_3 = new Array();
this.Champ_4 = new Array();
this.Champ_5 = new Array();

//-- La fonction de récupération
this.RecupAll = RecupAll;
}
//------------------------------------
// Fonction appelée par RecupAll
//------------------------------------
function RecupChamp( txt_, deb_, fin_){
var T_Result = new Array();
var szTmp;
var i = 0;
var Ind = 0;
var Pos = 0;
fin_ --; // pas de prise en compte du Séparateur de fin

//-- Quitte si rien à traiter
if( fin_ < deb_) return( null);

szTmp = txt_.substring( deb_, fin_);
szTmp += Sep[2]; // pour prendre en compte le dernier

//-- Récupération des champs
while(( Pos = szTmp.indexOf( Sep[2], Ind)) > -1 ){
T_Result[i++] = szTmp.substring( Ind, Pos);
Ind = Pos +1;
}

//-- Retourne le tableau
return( T_Result);
}

//--------------------------------
// Fonction de l'Objet Reference
//--------------------------------
function RecupAll(){
with( this){
Champ_1 = RecupChamp( Ligne, PosSep[1], PosSep[2]);
Champ_2 = RecupChamp( Ligne, PosSep[2], PosSep[3]);
Champ_3 = RecupChamp( Ligne, PosSep[3], PosSep[4]);
Champ_4 = RecupChamp( Ligne, PosSep[4], PosSep[5]);
Champ_5 = RecupChamp( Ligne, PosSep[5], PosSep[6]);
}
}
//---------------------------
function DecodRequette( txt_){
var i;
var Ind = 0; // Index recherche Séparateur
var Pos = 0; // Index Position tableau de résultat
var PosSep;
var Chaine = new Array();

txt_ += Sep[0]; // pour être sur de prendre en compte le dernier

//-- Récupération des Produits
while(( PosSep = txt_.indexOf( Sep[0], Ind)) > -1 ){
Tab[Pos] = new Reference( txt_.substring( Ind, PosSep));
Tab[Pos].RecupAll();
Pos++;
Ind = PosSep +1;
}

//-- La il y aurait matière a optimiser sérieusement

//-- Affichage

for( var i in Tab){ Html " Chaine Traitée
" +Tab[i].Ligne +'
&nbsp;';
Html += '';

Ind = 0;
Chaine[Ind] = '----
' + Tab[i].Produit + ', ';

for( var j in Tab[i].Champ_1){
Ind = 1;
Chaine[Ind] = Chaine[Ind -1] + '' + Tab[i].Champ_1[j] + ', ';

for( var k in Tab[i].Champ_2){
Ind = 2;
Chaine[Ind] = Chaine[Ind -1] +'' + Tab[i].Champ_2[k] + ', ';

for( var m in Tab[i].Champ_3){
Ind = 3;
Chaine[Ind] = Chaine[Ind -1] +'' + Tab[i].Champ_3[m] + ', ';

for( var n in Tab[i].Champ_4){
Ind = 4;
Chaine[Ind] = Chaine[Ind -1] +'' + Tab[i].Champ_4[n] + ', ';

for( var p in Tab[i].Champ_5){
Ind = 5;
Chaine[Ind] = Chaine[Ind -1] +'' + Tab[i].Champ_5[p] + ', ';
//-- Avec du récursif ca doit être jouable, mais c'est pas mon Fort...

if( Ind == 5)
Html += Chaine[Ind] +'';
}
if( Ind == 4)
Html += Chaine[Ind] +'';
}
if( Ind == 3)
Html += Chaine[Ind] +'';
}

if( Ind == 2)
Html += Chaine[Ind] +'';
}
if( Ind == 1)
Html += Chaine[Ind] +'';
}
if( Ind == 0)
Html += Chaine[Ind] +'';

Html += '
&nbsp;
';
document.write( Html);
}
}

PS :
Je ne connais rien aux BaseDeDonnées mais j'ai l'impression que c'est pile poil ce qui conviendrait avec une requêtte...

;0)
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_fabiano13 Messages postés 262 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 27 février 2012
6 avril 2006 à 18:29
Merci beaucoup.

Je vais m'inspirer de ton script si tu me le permets.

Je vais m'y pencher dessus pour que la partie récursive des boucles ne soit pas limiter qu'à 6 critères d'options !

A charge de revanche.

Cdt,
Fabiano13
[mailto:fnappa@ng-ski.com fnappa@ng-ski.com]
3
Rejoignez-nous