Boucle "for" qui ne fonctionne pas totalement ( panier )

Boucle "for" qui ne fonctionne pas totalement ( panier ) - PHP - Programmation

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...

Reply

Marsh Posté le 28-04-2005 à 09:57:49   

Reply

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  :D )
 
3. j'ai pas l'impression que ça ça passe:

Code :
  1. $a=count('liste');


 
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.  :jap:

Reply

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 !!!

Reply

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 :
  1. $a=count('liste');

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 :
  1. $a=count($liste);


 
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 :
  1. $ref = $_GET['reference'];
  2. $cle = array_search($ref, $liste);
  3. if ($cle!==false) {
  4.   // l'article se trouve deja dans le panier
  5. } else {
  6.   // l'article ne se trouve pas dans le panier
  7. }


 
 
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'
elements deja present dans le panier ['1','11','12','121','123']
1er passage :
 '1' == '123' ? Non, alors ajout ...
2e passage :
  '11' == '123' ?? Non, alors ajout...
3e passage :
  '12' == '123' ?? Non, alors ajout...
4e passage :  
  '121' == '123' ?? Non, alors ajout...
5e passage :
  '123' == '123' ?? Oui, alors incementation


Message édité par cerel le 28-04-2005 à 13:43:15
Reply

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 !!! :bounce:  ) 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 !!!

Reply

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 :
  1. // Cette fonction imite la fonction array_search (meme arguments).
  2. // array_search cherche un valeur dans un tableau et retourne la cle associe en
  3. //   cas de reussite.
  4. // biArray_search fait la meme chose, mais dans un tableau bidimensionel
  5. //   (tableau de tableaux en fait).
  6. // $needle (aiguille) est l'element a chercher
  7. // $haystack (meule de foin) est le tableau ou il faut faire la recherche
  8. // $strict indique s'il faut faire un test strict
  9. function biArray_search(&$needle, &$haystack, $strict=false) {
  10.   $tmp = false;
  11.   // On parcours le tableau
  12.   foreach($haystack as $key => $val) {
  13.     // Si l'element $val est de type tableau et que l'aiguille y a ete trouvee
  14.     if ((is_array($val) && (($tmp=array_search($needle,$val,$strict))!==false)) {
  15.        // On retourne un tableau qui indique
  16.        // [0] : l'element se trouvait dans un tableau ($val est un tableau dans
  17.        //       la meule)
  18.        // [1] : indique la premiere cle dans la meule
  19.        // [2] : indique la deuxieme cle dans le tableau (qui se trouve dans  
  20.        //       la meule)  
  21.        return new Array(true, $key,$tmp);
  22.      } else {
  23.         // $val n'est pas un tableau, alors on compare $val a l'aiguille
  24.         //    d'abord de facon stricte (si demande) puis de facon non stricte
  25.         if(($strict && $needle===$val) || (!$strict && $needle==$val)) {
  26.            // $val et l'aiguile sont identiques, alors on retourne un tableau :
  27.            // [0] : l'element ne se trouvait pas dans un tableau (donc on mets
  28.            //       false)
  29.            // [1] : indique la premiere cle dans la meule, qui est ou se trouve
  30.            //       l'aiguille.
  31.            return new Array(false, $key);
  32.          }
  33.      }
  34.   }
  35. }


 
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 :
  1. // list permet de faire associer des variables a des indices d'un tableau.
  2. list($multi,$key1,$key2) = biArray_search($needle,$haystack);
  3. // reviens au meme que :
  4. // $arr = biArray_search($needle,$haystack);
  5. // $multi = $arr[0];
  6. // $key1 = $arr[1];
  7. // $key2 = $arr[2];
  8. // Si l'aiguille se trouve dans un tableau a l'interieur de la meule
  9. if ($multi) {
  10.   // On affiche l'aiguille
  11.   echo $haystack[$key1][$key2];
  12. } else {
  13.   // L'aiguille ne se trouvait pas dans un tableau a l'interieur de la meule
  14.   // Donc on peut simplement y acceder comme ca :
  15.   echo $haystack[$key1];
  16. }


Message édité par cerel le 29-04-2005 à 10:50:58
Reply

Marsh Posté le 28-04-2005 à 16:02:13    

T'es sur que ca marche?

Reply

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. :pt1cable:  Bon faut que je bosse là...et y'a du boulot apparemment...

Reply

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]


Message édité par cerel le 29-04-2005 à 10:24:53
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed