Page 1 sur 1

Tri tableau - Affichage

Posté : 20 sept. 2012, 19:42
par Bisvan
Bonjour,

Je me heurte à un problème.
Je suis en train de développer un script pour une page de commande de pizza.
J'affiche dans mon récap commande une liste de produit choisie par le client (dont des pizza).

J'aimerai mettre en place un script qui calcul une offre 1pizza achetée=1 pizza offerte avec comme paramètre que la pizza offerte soit du même tarif que l'autre ou inférieur.
Or je ne vois pas trop comment gérer ça.
J'ai pensé faire un tableau associatif des produits PIZZA choisi par le client
$verifpizza[] = array('idproduit' => $idarticle, 'prix' => $tarif, 'nbre' => $quantitearticle);
Ensuite faire un foreach et un tri
foreach ($verifpizza as $key => $row) 
	{
		$colonne1[$key]  = $row['idproduit'];
		$colonne2[$key] = $row['prix'];
		$colonne3[$key] = $row['nbre'];
	}
	array_multisort($colonne2, SORT_DESC, $verifpizza);
J'ai ainsi un affichage décroissant du prix de chaque pizza choisie.
Mais comment exploiter ces données pour choisir parmi la liste celle qui sera "offerte". Une idée pour m'aider ?

merci !

Re: Tri tableau - Affichage

Posté : 20 sept. 2012, 20:49
par dix2
salut,

avec le code suivant, ça devrait fonctionner :
<?PHP
$verifpizza[] = array('idproduit' => 12, 'prix' => 8, 'nbre' => 1);
$verifpizza[] = array('idproduit' => 11, 'prix' => 6, 'nbre' => 3);
$verifpizza[] = array('idproduit' => 18, 'prix' => 14, 'nbre' => 4);
$verifpizza[] = array('idproduit' => 19, 'prix' => 7, 'nbre' => 3);
$verifpizza[] = array('idproduit' => 15, 'prix' => 10, 'nbre' => 6);

foreach ($verifpizza as $key => $row) {
    $prix[$key] = $row['prix'];
}
array_multisort($prix, SORT_DESC, $verifpizza);

//var_dump($verifpizza);

$offert = 0;
foreach ($verifpizza as &$row) {
    if ($row['nbre'] % 2) {
        $row['offert'] = $offert;
        $offert = $offert ? 0 : 1;
    }
    else {
        $row['offert'] = 0;
    }
}
unset($row);

//var_dump($verifpizza);

// pour connaitre la remise
$remise = 0;
foreach ($verifpizza as $row) {
    $remise += $row['prix'] * (floor($row['nbre'] / 2) + $row['offert']);
}
echo('la remise est de : '.$remise.' euros<br /><br />');

//pour connaitre les ids des pizzas offertes
$liste_free_pizzas = array();
foreach ($verifpizza as $row) {
    if ($row['nbre'] > 1 || $row['offert']) {
        $liste_free_pizzas[] = array('idproduit' => $row['idproduit'], 'nbre' => floor($row['nbre'] / 2) + $row['offert']);
    }
}
//var_dump($liste_free_pizzas);
echo('les pizzas offertes sont :');
echo('<ul>');
foreach ($liste_free_pizzas as $row) {
    echo('<li>'.$row['nbre'].' pizza(s) dont l\'id est '.$row['idproduit'].'</li>');
}
echo('</ul>');
@+
dix2

Re: Tri tableau - Affichage

Posté : 21 sept. 2012, 17:33
par Bisvan
C'est super gentil ! merci beaucoup pour ton aide !
Par contre pourrais tu juste me dire ou se situe le paramètre 1 offerte pour 1 achetée ?
Car j'aimerai aussi adapté le script dans un autre environnement à 1 offerte pour 2 achetée ?

merci encore !

Re: Tri tableau - Affichage

Posté : 21 sept. 2012, 18:50
par dix2
<?PHP
// 1 pizza offerte pour FREQUENCE pizzas achetées
// ex : si FREQUENCE = 3, 1 pizza offerte pour 3 pizzas achetées
define('FREQUENCE', 3);

/**************** début déclaration des fonctions ****************/
/**
 * trie la liste des pizzas en fonction du prix et par ordre décroissant
 * @param array &$liste_pizzas_simple
 * @return NULL
 */
function trie_liste_pizzas (&$liste_pizzas_simple) {
    foreach ($liste_pizzas_simple as $key => $row) {
        $prix[$key] = $row['prix'];
    }
    array_multisort($prix, SORT_DESC, $liste_pizzas_simple);
}

/**
 * ajoute au tableau $liste_pizzas_simple les informations nécessaires pour gérer les pizzas offertes
 * @param array &$liste_pizzas_simple
 * @param int $frequence
 * @return NULL
 */
function manage_free_pizza (&$liste_pizzas_simple, $frequence) {
    $offert = 0;
    foreach ($liste_pizzas_simple as &$pizza) {
        if ($pizza['nbre'] % $frequence) {
            $pizza['offert'] = (++$offert == $frequence) ? 1 : 0;
            $offert = $offert % $frequence;
        }
        else {
            $pizza['offert'] = 0;
        }
    }
    unset($row);
}

/**
 * calcule la remise
 * @param array $liste_pizzas_advanced
 * @param int $frequence
 * @return int
 */
function calcule_remise ($liste_pizzas_advanced, $frequence) {
    $remise = 0;
    foreach ($liste_pizzas_advanced as $pizza) {
        $remise += $pizza['prix'] * (floor($pizza['nbre'] / $frequence) + $pizza['offert']);
    }
	return $remise;
}

/**
 * crée la liste des pizzas offertes
 * @param array $liste_pizzas_advanced
 * @param int $frequence
 * @return array
 */
function create_liste_free_pizzas ($liste_pizzas_advanced, $frequence) {
    $liste_free_pizzas = array();
    foreach ($liste_pizzas_advanced as $pizza) {
        if ($pizza['nbre'] >= $frequence || $pizza['offert']) {
            $liste_free_pizzas[] = array('idproduit' => $pizza['idproduit'], 'nbre' => floor($pizza['nbre'] / $frequence) + $pizza['offert']);
        }
    }
	return $liste_free_pizzas;
}
/***************** fin déclaration des fonctions *****************/


$verifpizza[] = array('idproduit' => 12, 'prix' => 8, 'nbre' => 1);
$verifpizza[] = array('idproduit' => 11, 'prix' => 6, 'nbre' => 2);
$verifpizza[] = array('idproduit' => 18, 'prix' => 14, 'nbre' => 4);
$verifpizza[] = array('idproduit' => 19, 'prix' => 7, 'nbre' => 3);
$verifpizza[] = array('idproduit' => 15, 'prix' => 10, 'nbre' => 6);

trie_liste_pizzas($verifpizza);

//var_dump($verifpizza);

manage_free_pizza($verifpizza, FREQUENCE);

//var_dump($verifpizza);

echo('la remise est de : '.calcule_remise($verifpizza, FREQUENCE).' euros<br /><br />');

$liste_free_pizzas = create_liste_free_pizzas($verifpizza, FREQUENCE);

//var_dump($liste_free_pizzas);

echo('les pizzas offertes sont :');
echo('<ul>');
foreach ($liste_free_pizzas as $pizza) {
    echo('<li>'.$pizza['nbre'].' pizza(s) dont l\'id est '.$pizza['idproduit'].'</li>');
}
echo('</ul>');
y a juste à modifier la constante FREQUENCE en fonction de ce qu'on veut

@+
dix2

Re: Tri tableau - Affichage

Posté : 22 sept. 2012, 17:53
par dix2
c'est mieux comme ça :wink: :
<?PHP
// 1 pizza offerte pour FREQUENCE pizzas achetées
// ex : si FREQUENCE = 3, 1 pizza offerte pour 3 pizzas achetées
define('FREQUENCE', 3);

/**************** début déclaration des fonctions ****************/
/**
 * renvoie la liste des pizzas triée en fonction du prix et par ordre décroissant
 * @param array $liste_pizzas_simple
 * @return array
 */
function trie_liste_pizzas ($liste_pizzas_simple) {
    foreach ($liste_pizzas_simple as $key => $row) {
        $prix[$key] = $row['prix'];
    }
    array_multisort($prix, SORT_DESC, $liste_pizzas_simple);
    
    return $liste_pizzas_simple;
}

/**
 * renvoie un tableau composé de la fréquence "promotionnelle" et de la liste des pizzas augmentée des informations nécessaires pour gérer les pizzas offertes
 * @param array $liste_pizzas_simple
 * @param int $frequence
 * @return array
 */
function manage_free_pizza ($liste_pizzas_simple, $frequence = FREQUENCE) {
    $commande = array('frequence' => $frequence, 'liste_pizzas_advanced' => trie_liste_pizzas($liste_pizzas_simple));
    
    $offert = 0;
    foreach ($commande['liste_pizzas_advanced'] as &$pizza) {
        if ($pizza['nbre'] % $frequence) {
            $pizza['offert'] = (++$offert == $frequence) ? 1 : 0;
            $offert = $offert % $frequence;
        }
        else {
            $pizza['offert'] = 0;
        }
    }
    unset($pizza);
    
    return $commande;
}

/**
 * calcule la remise
 * @param array $commande
 * @return int
 */
function calcule_remise ($commande) {
    $remise = 0;
    foreach ($commande['liste_pizzas_advanced'] as $pizza) {
        $remise += $pizza['prix'] * (floor($pizza['nbre'] / $commande['frequence']) + $pizza['offert']);
    }
    return $remise;
}

/**
 * renvoie la liste des pizzas offertes
 * @param array $commande
 * @return array
 */
function create_liste_free_pizzas ($commande) {
    $liste_free_pizzas = array();
    foreach ($commande['liste_pizzas_advanced'] as $pizza) {
        if ($pizza['nbre'] >= $commande['frequence'] || $pizza['offert']) {
            $liste_free_pizzas[] = array('idproduit' => $pizza['idproduit'], 'nbre' => floor($pizza['nbre'] / $commande['frequence']) + $pizza['offert']);
        }
    }
    return $liste_free_pizzas;
}
/***************** fin déclaration des fonctions *****************/


$liste_pizzas_simple[] = array('idproduit' => 12, 'prix' => 8, 'nbre' => 1);
$liste_pizzas_simple[] = array('idproduit' => 11, 'prix' => 6, 'nbre' => 2);
$liste_pizzas_simple[] = array('idproduit' => 18, 'prix' => 14, 'nbre' => 4);
$liste_pizzas_simple[] = array('idproduit' => 19, 'prix' => 7, 'nbre' => 3);
$liste_pizzas_simple[] = array('idproduit' => 15, 'prix' => 10, 'nbre' => 6);

$commande = manage_free_pizza($liste_pizzas_simple);

//var_dump($commande);

echo('la remise est de : '.calcule_remise($commande).' euros<br /><br />');

$liste_free_pizzas = create_liste_free_pizzas($commande);

//var_dump($liste_free_pizzas);

echo('les pizzas offertes sont :');
echo('<ul>');
foreach ($liste_free_pizzas as $pizza) {
    echo('<li>'.$pizza['nbre'].' pizza(s) dont l\'id est '.$pizza['idproduit'].'</li>');
}
echo('</ul>');
soit tu modifies la constante FREQUENCE
soit tu appelles la fonction manage_free_pizza comme ceci :
$commande = manage_free_pizza($liste_pizzas_simple, 2); // 1 pizza offerte pour 2 achetées

en fait, la constante FREQUENCE définit la valeur par défaut
alors qu'appeler la fonction manage_free_pizza avec le 2ème paramètre permet de définir une commande avec une opération promotionnelle ponctuelle

@+
dix2

Re: Tri tableau - Affichage

Posté : 27 sept. 2012, 17:46
par Bisvan
C'est vraiment très gentil !!
Merci beaucoup pour ton aide !