Boucle "for" qui ne fonctionne pas totalement ( panier ) - PHP - Programmation
Marsh Posté le 28-04-2005 à 11:49:14
1. tu devrais faire attention parceque tu as des espaces entre les mots parfois du genre --> $_SESSI ON['pouet']
2.pense a mettre toutes les accolades quand même --> "full bracketed syntax" (c'est Florent qui va être content )
3. j'ai pas l'impression que ça ça passe:
Code :
|
4. je debute egalement et je me permet de te demander a quoi sert ta boucle?
pourquoi ne pas comparer les references du panier avec celle que le client ajouter, si elle existe on increment la quantité (et eventuellement le prix je ne sais pas comment tu procède), etc... sinon, on rajoute la ligne correspondant au produit.
Marsh Posté le 28-04-2005 à 12:24:43
Salut et bien content de ta réponse.
Pour le point 1: petite faute de frappe.
Pour le point 2:Tu parles de quelles accolades ?Je pense ne pas en avoir oubliées !J'aurais pu en mettre moins même .
Pour le point 3: le $a=count('liste'); passe plutôt bien en fait ( du moins j'ai l'impression)
Pour le point 4: C'est en fait exactement ce que je fais. Avec count, je compte le nombre d'articles présents dans le panier. Avec la boucle FOR ( et les conditions) je demande de comparer la référence du premier article avec la référence que je veux ajouter et ainsi de suite pour tous les articles déjà présents. Si elle n'existe pas je mets la quantité à 1. Si elle existe j'incremente la qtté .Mais comme je le dis dans le premier post.Quand j'ajoute 2 fois un deuxième article et bien là ça n'incremente pas. Donc je pense que je n'arrive pas à rentrer dans la boucle... Un petit coup de main SVP !!!
Marsh Posté le 28-04-2005 à 13:17:10
Point 2 : pmusa parlait des accolades dans les premiers if. Dans le cadre du if, les accolades sont facultatives, si le if ne contient qu'une seule instruction. Neanmoins elles sont vivement recommandees. Pour la simple et bonne raison, que cela t'eviteras des casse tetes si tu ajoutes du code par la suite. Du genre un "echo" pour debuger...
Point 3 :
Code :
|
fonctionne effectivement, mais peut-etre pas de la facon dont tu veux ...
Avec ce code, $a vaudra toujours 5 ...
Pkoi ca ? Car tu lui passe 'liste' qui est une String. Donc du coup, il va compte le nbre de chars que contient la String, a savoir 5...
Si en revanche, tu veux connaitre la taille du tableau liste, alors tu dois faire comme ca :
Code :
|
Point 4 : Tu te compliques la vie, si tu veux savoir si quelque chose se trouve deja dans un tableau, il y a une fonction pour ca : in_array.
Si tu veux connaitre la position d'un element dans un tableua, tu as une autre fonction : array_search
Donc en gros :
Code :
|
Apres une lecture plus attentive de ton post, je remarque que tu utilise un tableaux de tableaux, donc le code que j'ai poste ci-dessus risque de pas fonctionner tel quel.
Sinon, concernant ta boucle for, elle contient un probleme. Si l'element que tu cherches n'est pas le premier dans ton tableau tu l'ajoutes. En fait, admetons que tu aie 5 items dans ton panier, avec ta boucle, si tu veux ajouter encore une fois le meme item que celui qui est en 5, ben tu va l'ajouter 4 fois.
Ca va se passer comme ca :
ajout element '123' |
Marsh Posté le 28-04-2005 à 15:16:27
Salut et merci pour ta réponse
Je vais regarder point par point tes propositions.
Sinon comme tu le fais remarquer j'utilise des tableaux bidimensionnels ( j'ai pas peur !!! ) et je crois que mon pb vient de là. Dans ma boucle je ne traite en fait que la premiere ligne de mon tableau biditrucmuche.il faut que j'arrive a passer à la deuxième.Bon j'y bosse...mais va falloir un peu de temps
Surtout si vous avez une idée, ne me laissez pas tomber !!!
Marsh Posté le 28-04-2005 à 15:53:05
Tu peux tres facilement utiliser array_search pour creer un fonction de recherche dans un tableau bidimensionel :
Code :
|
bon j'ai pas teste ce code, mais il devrait fonctionner dans un tableau bidimensionel ou non (ou meme melange).
Ce code fait ca :
Il parcours le tableau passe en paramatre grace a l'aide de foreach.
Si la boucle rencontre un element de type tableau, alors on utilise array_search pour faire un recherche dedans. Si le resultat est strictement diferent de false, alors on retourne un tableau compose de la sorte :
indice 0 : la valeur est-elle dans un sous tableau ? Oui
indice 1 : premiere cle
indice 2 : deuxieme cle
Si needle n'est pas dans le tableau alors on fait rien.
Si l'element n'est pas un tableau, alors on le compare a needle. Si c'est notre needle alors on retourne un tableau de la sorte :
indice 0 : la valeur est-elle dans un sous tableau ? Oui
indice 1 : cle
Un exemple d'utilisation :
Code :
|
Marsh Posté le 28-04-2005 à 22:52:56
Cerel bon là clairement tu me tues.
Je débarque sur le forum en me disant qu'avec un peu de chance je me suis juste trompé sur un ; ou une ', un truc à la "con" et puis voilà que tu me balances ( mais je t'en remercie of course ) un truc où je pige que dalle. Bon faut que je bosse là...et y'a du boulot apparemment...
Marsh Posté le 29-04-2005 à 10:10:35
Ben dans ton code de base il y a des erreurs.
Et la fonction que j'ai poste est une fonction que j'ai fait pour faire un array_search dans un tableau bidimensionel (fonction que j'ai pas teste, je le repete).
Qu'est-ce que tu comprends pas ?
[edit]
J'ai edite mon message plus haut afin d'y ajouter des commentaires.
J'espere que cela aidera a la comprehension du code.
Petite remarque, si la meule n'est pas tableau bidimensionel, alors biArray_search fonctionne exactement comme array_search.
Ma fonction peut faire des recherches sur des tableaux "hibrides", c'est peut-etre cela qui pose probleme.
[/edit]
Marsh Posté le 28-04-2005 à 09:57:49
Voila j'ai trouvé un script de panier dans un bouquin ( très bien au demeurant).
Je vous mets ci-dessous l'original
---------------------------------------------------
if ((!isset($_SESSION['liste']))&&($ajoutPanier=="" )) $liste[]=array("VIDE",1,0,0);//init de liste si VIDE
if (isset($_SESSION['liste'])) $liste=$_SESSION['liste'];//recup de la liste de la session
if ($ajoutPanier=="AJOUTER" )
{
$reference=$_GET['reference'];
$nb=1; //par défaut la quantité est = 1
$prix=$_GET['prix'];
$liste[]=array($reference,$nb,$prix,$prix);
$_SESSI ON['liste']=$liste;
//ajoute un article à la liste
}
-------------------------------------------
Grosso modo on passe par l'url la reference de l'article et son prix et en appuyant sur un bouton ( valeur :AJOUTER) de la fiche détail de l'article, hop ca va dans le panier.
Pas mal mais pas complet.
En effet si ,par hasard, je décide de remmettre une deuxième fois l'article dans mon panier, ce script n'incremante pas la quantité de +1 mais ajoute l'article sur une deuxième ligne dans mon caddie.
J'ai donc essayé de bidouiller. Voici ce que j'ai fait ( soyez indulgent)
----------------
if ((!isset($_SESSION['liste']))&&($ajoutPanier=="" )) $liste[]=array("VIDE",1,0,0);//init de liste si VIDE
if (isset($_GET['liste'])) $liste=$_SESSION['liste'];
if ($ajoutPanier=="AJOUTER" )
{
$reference=$_GET['reference'];
$a=count('liste');
for ($i=0;$i<$a;$i++)
{
if($reference!=$liste[$i][0])
{
$nb=1;
$prix= $_GET['prix'];
$liste[]=array($reference,$nb,$prix,$prix);
$_SESSION['list e']=$liste;
}
else
{
$liste[$i][1]++;
$nb=$liste[$i][1];
$prix =$_GET['prix'];
$_SESSION['liste']=$liste;
}
}
}
---------------- ----------------------------------
Alors vous voyez ça marche.... enfin presque...
En effet si je met un premier produit dans mon panier, ça passe tb.Je remets ce même produit, nickel la quantité s'incremente de +1.Super je me dis, t'es un gros pro.Et puis je tente de rajouter un autre produit different.Ca passe. Je me dis, je vais essayer de rajouter une deuxième fois ce deuxième produit en espérant que la quantité s'incrémente de 1...et là v'la t'y pas que ça s'incrémente pas ...J'y crois pas!!!
J'ai cherché un peu mais là je commence à m'énerver ( ca fait 15 jours que j'essaie de résoudre ce pb d'incrementation ).
Alors si vous avez une idée !!!
Au fait j'espére avoir été assez clair...et pas trop long...