[Résolu] Utilisation de la fonction max ?

Eléphant du PHP | 250 Messages

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...
Modifié en dernier par Boro64 le 06 févr. 2011, 22:15, modifié 1 fois.
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

Invité
Invité n'ayant pas de compte PHPfrance

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

Eléphant du PHP | 250 Messages

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... |*()
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

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;
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 250 Messages

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.
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 250 Messages

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!
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."