[Résolu] Utilisation de la fonction max ?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [Résolu] Utilisation de la fonction max ?

Re: Utilisation de la fonction max ?

par Boro64 » 06 févr. 2011, 22:15

Bonjour
désolé pour le retard de ma réponse.
Merci Ryle, j'ai un peu mieux compris le fonctionnement; mais finalement j'ai gardé la fonction max() et j'ai adapté mon script ainsi:
function MontantGlobal(){
   $total=0;
   for($i = 0; $i < count($_SESSION['topcase']['id_article']); $i++)
   {
      $total += $_SESSION['topcase']['qte'][$i] * $_SESSION['topcase']['prix'][$i];
	  $transport =  max($_SESSION['topcase']['port']);
	  $finale = $total + $transport;
	  
   }
   return $finale;
}
Et ça marche!
merci à tous!

Re: Utilisation de la fonction max ?

par Ryle » 05 févr. 2011, 13:38

C'est surtout un problème de logique :)

La fonction max() te retourne la valeur maximum de ton tableau... donc si ton tableau de frais de port contient les valeur 15 et 16, la fonction max() retournera systématiquement la valeur 16. Tu auras donc ton premier article à 15€ (prix) + 16€ (port max) et le second à 12€ (prix) + 16€ (port max) ... soit un total de 59€

C'est donc un soucis de conception... je n'ai pas regardé comment était constitué ton tableau $_SESSION['topcase'], mais peut-être suffit-il de faire appel à $_SESSION['topcase']['port'][$i] et d'oublier le max :)

Re: Utilisation de la fonction max ?

par Boro64 » 05 févr. 2011, 10:50

Bonjour
Alors, je confirme bien ce que je disais: avec la $transport seule, si je sélectionne (au moins) 2 produits, l'un à 15€ + 15€ de port et le second à 12€ + 16€ de port, le total affiché est de.........59€ !!!!!!!!!!!!!!! :shock: .
Mais peut être le problème est il ailleurs? (qui a dit entre la chaise et le clavier?)...
Voici donc l'inbtégralité du code:
<?php

/**
 * Verifie si le topcase existe, le créer sinon
 * @return booleen
 */
function creationTopcase(){
   if (!isset($_SESSION['topcase'])){
      $_SESSION['topcase']=array();
      $_SESSION['topcase']['id_article'] = array();
	  $_SESSION['topcase']['titre'] = array();
      $_SESSION['topcase']['qte'] = array();
      $_SESSION['topcase']['prix'] = array();
	  $_SESSION['topcase']['port'] = array();
      $_SESSION['topcase']['verrou'] = false;
   }
   return true;
}


/**
 * Ajoute un article dans le topcase
 * @param string $id_article
 * @param int $qte
 * @param float $prix
 * @return void
 */
function ajouterArticle($id_article,$titre,$qte,$prix,$port){

   //Si le topcase existe
   if (creationTopcase() && !isVerrouille())
   {
      //Si le produit existe déjà on ajoute seulement la quantité
      $positionProduit = array_search($id_article,  $_SESSION['topcase']['id_article']);

      if ($positionProduit !== false)
      {
         $_SESSION['topcase']['qte'][$positionProduit] += $qte ;
      }
      else
      {
         //Sinon on ajoute le produit
         array_push( $_SESSION['topcase']['id_article'],$id_article);
		 array_push( $_SESSION['topcase']['titre'],$titre);
         array_push( $_SESSION['topcase']['qte'],$qte);
         array_push( $_SESSION['topcase']['prix'],$prix);
		 array_push( $_SESSION['topcase']['port'],$port);
      }
   }
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}



/**
 * Modifie la quantité d'un article
 * @param $id_article
 * @param $qte
 * @return void
 */
function modifierQTeArticle($id_article,$qte){
   //Si le topcase éxiste
   if (creationTopcase() && !isVerrouille())
   {
      //Si la quantité est positive on modifie sinon on supprime l'article
      if ($qte > 0)
      {
         //Recharche du produit dans le topcase
         $positionProduit = array_search($id_article,  $_SESSION['topcase']['id_article']);

         if ($positionProduit !== false)
         {
            $_SESSION['topcase']['qte'][$positionProduit] = $qte ;
         }
      }
      else
      supprimerArticle($id_article);
   }
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}

/**
 * Supprime un article du topcase
 * @param $id_article
 * @return unknown_type
 */
function supprimerArticle($id_article){
   //Si le topcase existe
   if (creationTopcase() && !isVerrouille())
   {
      //Nous allons passer par un topcase temporaire
      $tmp=array();
      $tmp['id_article'] = array();
	  $tmp['titre'] = array();
      $tmp['qte'] = array();
      $tmp['prix'] = array();
	  $tmp['port'] = array();
      $tmp['verrou'] = $_SESSION['topcase']['verrou'];

      for($i = 0; $i < count($_SESSION['topcase']['id_article']); $i++)
      {
         if ($_SESSION['topcase']['id_article'][$i] !== $id_article)
         {
            array_push( $tmp['id_article'],$_SESSION['topcase']['id_article'][$i]);
			array_push( $tmp['titre'],$_SESSION['topcase']['titre'][$i]);
            array_push( $tmp['qte'],$_SESSION['topcase']['qte'][$i]);
            array_push( $tmp['prix'],$_SESSION['topcase']['prix'][$i]);
			array_push( $tmp['port'],$_SESSION['topcase']['port'][$i]);
         }

      }
      //On remplace le topcase en session par notre topcase temporaire à jour
      $_SESSION['topcase'] =  $tmp;
      //On efface notre topcase temporaire
      unset($tmp);
   }
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}


/**
 * Montant total du topcase
 * @return int
 */
function MontantGlobal(){
   $total=0;
   for($i = 0; $i < count($_SESSION['topcase']['id_article']); $i++)
   {
        $transport = max($_SESSION['topcase']['port']);
      $total += $_SESSION['topcase']['qte'][$i] * $_SESSION['topcase']['prix'][$i] + $transport;
   }
   return $total;
}
 


/**
 * Fonction de suppression du topcase
 * @return void
 */
function supprimePanier(){
   unset($_SESSION['topcase']);
}

/**
 * Permet de savoir si le topcase est verrouillé
 * @return booleen
 */
function isVerrouille(){
   if (isset($_SESSION['topcase']) && $_SESSION['topcase']['verrou'])
   return true;
   else
   return false;
}

/**
 * Compte le nombre d'articles différents dans le topcase
 * @return int
 */
function compterArticles()
{
   if (isset($_SESSION['topcase']))
   return count($_SESSION['topcase']['id_article']);
   else
   return 0;

}

?>
Moi, je ne comprends plus rien ! Et vous?
Merci de vos avis.

Re: Utilisation de la fonction max ?

par Ryle » 04 févr. 2011, 23:11

Lorsque ta variable est un tableau, $variable[$i] te retourne la valeur du tableau à l'index "$i". Lorsque ta variable est une chaine de caractères, $variable[$i] te retourne le caractère qui se trouve à la position "$i".

En gros si $transport = 15, $transport[$i] te retourne 1 quand $i = 0, et 5 quand $i = 1. Donc forcément, à chaque itération de ta boucle tu ajoutes l'un des chiffres de ta valeur max au lieu d'ajouter la valeur...

Suis les consignes de notre "invité", et tu ajouteras bien la valeur à chaque itération :)
$total += $_SESSION['topcase']['qte'][$i] * $_SESSION['topcase']['prix'][$i] + $transport;

Re: Utilisation de la fonction max ?

par Boro64 » 04 févr. 2011, 23:00

Salut "Invité" ! :P
Hélas non, j'ai testé avec et sans, mais ça n'a rien à voir. Non, ce qui est "étrange" (pour moi, je le précise) c'est que le résultat de l'appel à la fonction est correct (si le montant le plus élevé est 15 disons, elle le sélectionne bien, je l'ai vu en faisant un echo de la $transport), mais ensuite au lieu d'additionner ce 15, le résultat est:
$total += $_SESSION['topcase']['qte'][$i] * $_SESSION['topcase']['prix'][$i] +
...(1+5), soit 6 de plus au lieu de 15 :afraid: ...!!!!
Et c'est cela que je voudrai comprendre/résoudre: comment lui faire comprendre que 15 est un entier et non pas une suite de chiffres à additionner?
J'imagine que la réponse doit être évidente/simple, mais là, je sèche... |*()

Re: Utilisation de la fonction max ?

par Invité » 04 févr. 2011, 20:18

salut,

a priori,
$transport[$i] serait le problème, vu que tu recupèrerai une valeur avec max.
du coup + $transport suffirait non ?
a voir !! :)

[Résolu] Utilisation de la fonction max ?

par Boro64 » 04 févr. 2011, 19:30

Bonjour
Pour un panier, j'ai besoin de ne retenir que la valeur la plus haute du tableau des frais de port.
Je pensais donc utiliser la fonction max.
Or, j'obtiens un résultat ...bizarre, ou en tout cas, pas celui attendu:
Lorsque ma valeur vaut plus de 10, c'est l'addition des 2 chiffres du nombre qui se fait... Ainsi 11 vaudra 2, 12 vaudra 13, etc...ce qui est gênant.
Comment puis je garder cet entier...entier?
Voici la fonction que j'utilise:
function MontantGlobal(){
   $total=0;
   for($i = 0; $i < count($_SESSION['topcase']['id_article']); $i++)
   {
	$transport = max($_SESSION['topcase']['port']);
      $total += $_SESSION['topcase']['qte'][$i] * $_SESSION['topcase']['prix'][$i] + $transport[$i];
   }
   return $total;
}
Quelle serait la solution?
D'avance merci pour vos avis, pistes, suggestions...