IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Aide à l'optimisation de code


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut Aide à l'optimisation de code
    Bonjour à tous,

    Je me sens vraiment très bête sur ce coup là. En fait, je souhaiterai un coup de main afin d'optimiser le code dont voici un extrait :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    $carnaval = ( isset($_POST['carnaval'])) ? $_POST['carnaval'] : null;
    $apapier = ( isset($_POST['apapier'])) ? $_POST['apapier'] : null;
    $fpapier = ( isset($_POST['fpapier'])) ? $_POST['fpapier'] : null;
    $tresor = ( isset($_POST['tresor'])) ? $_POST['tresor'] : null;
     
    $utdebut = mktime($heure, $minute, 0, $mois, $jour, $annee);
    /*0001*/
    if( $carnaval == null && $apapier == null && $fpapier == null && $tresor != null ){
    	$uttdebut = $utdebut;
    	$uttfin = $uttdebut + 3600;
    }
    /*0010*/
    if( $carnaval == null && $apapier == null && $fpapier != null && $tresor == null ){
    	$utfpdebut = $utdebut;
    	$utfpfin = $utfpdebut + 3600;
    }
    /*0011*/
    if( $carnaval == null && $apapier == null && $fpapier != null && $tresor != null ){
    	$utfpdebut = $utdebut;
    	$utfpfin = $utfpdebut + 3600;
    	$uttdebut = $utfpfin;
    	$uttfin = $uttdebut + 3600;
    }
    /*0100*/
    if( $carnaval == null && $apapier != null && $fpapier == null && $tresor == null ){
    	$utapdebut = $utdebut;
    	$utapfin = $utapdebut + 3600;
    }
    /*0101*/
    if( $carnaval == null && $apapier != null && $fpapier == null && $tresor != null ){
    	$utapdebut = $utdebut;
    	$utapfin = $utapdebut + 3600;
    	$uttdebut = $utapfin;
    	$uttfin = $uttdebut + 3600;
    }
    /*0110*/
    if( $carnaval == null && $apapier != null && $fpapier != null && $tresor == null ){
    	$utapdebut = $utdebut;
    	$utapfin = $utapdebut + 3600;
    	$utfpdebut = $utapfin;
    	$utfpfin = $utfpdebut + 3600;
    }
    /*0111*/
    if( $carnaval == null && $apapier != null && $fpapier != null && $tresor != null ){
    	$utapdebut = $utdebut;
    	$utapfin = $utapdebut + 3600;
    	$utfpdebut = $utapfin;
    	$utfpfin = $utfpdebut + 3600;
    	$uttdebut = $utfpfin;
    	$uttfin = $uttdebut + 3600;
    }
    /*1000*/
    if( $carnaval != null && $apapier == null && $fpapier == null && $tresor == null ){
    	$utcdebut = $utdebut;
    	$utcfin = $utcdebut + 3600;
    }
    /*1001*/
    if( $carnaval != null && $apapier == null && $fpapier == null && $tresor != null ){
    	$utcdebut = $utdebut;
    	$utcfin = $utcdebut + 3600;
    	$uttdebut = $utcfin;
    	$uttfin = $uttdebut + 3600;
    }
    /*1010*/
    if( $carnaval != null && $apapier == null && $fpapier != null && $tresor == null ){
    	$utcdebut = $utdebut;
    	$utcfin = $utcdebut + 3600;
    	$utfpdebut = $utcfin;
    	$utfpfin = $utfpdebut + 3600;
    }
    /*1011*/
    if( $carnaval != null && $apapier == null && $fpapier != null && $tresor != null ){
    	$utcdebut = $utdebut;
    	$utcfin = $utcdebut + 3600;
    	$utfpdebut = $utcfin;
    	$utfpfin = $utfpdebut + 3600;
    	$uttdebut = $utfpfin;
    	$uttfin = $uttdebut + 3600;
    }
    /*1100*/
    if( $carnaval != null && $apapier != null && $fpapier == null && $tresor == null ){
    	$utcdebut = $utdebut;
    	$utcfin = $utcdebut + 3600;
    	$utapdebut = $utcfin;
    	$utapfin = $utapdebut + 3600;
    }
    /*1101*/
    if( $carnaval != null && $apapier != null && $fpapier == null && $tresor != null ){
    	$utcdebut = $utdebut;
    	$utcfin = $utcdebut + 3600;
    	$utapdebut = $utcfin;
    	$utapfin = $utapdebut + 3600;
    	$uttdebut = $utapfin;
    	$uttfin = $uttdebut + 3600;
    }
    /*1110*/
    if( $carnaval != null && $apapier != null && $fpapier != null && $tresor == null ){
    	$utcdebut = $utdebut;
    	$utcfin = $utcdebut + 3600;
    	$utapdebut = $utcfin;
    	$utapfin = $utapdebut + 3600;
    	$utfpdebut = $utapfin;
    	$utfpfin = $utfpdebut + 3600;
    }
    /*1111*/
    if( $carnaval != null && $apapier != null && $fpapier != null && $tresor != null ){
    	$utcdebut = $utdebut;
    	$utcfin = $utcdebut + 3600;
    	$utapdebut = $utcfin;
    	$utapfin = $utapdebut + 3600;
    	$utfpdebut = $utapfin;
    	$utfpfin = $utfpdebut + 3600;
    	$uttdebut = $utfpfin;
    	$uttfin = $uttdebut + 3600;
    }

    Je vous prie d'avance d'excuser ce code pas optimiser pour un bit. Mais malheureusement, mon cours d'algo remonte à il y a tellement longtemps, que je ne sais plus comment résoudre ce problème.

    Une solution serait par exemple de concaténer les différentes variables $carnaval, $apapier, $fpapier et $tresor en une chaine de caractère, et passer par un switch case, qui me ferais 15 case (le cas ou tout est null est signe d'erreur et renvoie une exception).

    En vous remerciant pour toutes aide que vous pourrez m'apporter pour me mettre sur la voie.

    Si par contre je trouve une solution afin de réduire le nombre d'itération de if, je placerai le code sans hésiter.

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Si par contre je trouve une solution afin de réduire le nombre d'itération de if,
    If n'est pas une structure de boucle

    Pour optimiser ton code, surtout d'un point de vue esthétique, fais un switch déjà. Je te rappelle que tu peux
    - utiliser des expressions dans les case
    - utiliser des chaines dans les case (contrairement à C)
    - grouper les case

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    switch ($var) {
      case 1:
      case 2:
      case 3:
        echo "On est dans le cas 1, 2 ou 3";
        break;
      case 4:
        echo "On est dans cas 4";
      case ($var === "salade au cummin"):
        echo "J'aime la " . $var;
        break;
      default:
        echo "On sait pas ou on est";
        break;
    }
    Ensuite, je tien à rappeller qu'utiliser est inexact. Voir cet article sur le sujet, tu sera surpris de voir ce qui peut être évalué comme vrai ou faux en PHP. S'il faut vérifier que la variable existe: isset. S'il faut vérifier que la variable existe et n'est pas vide: empty.

    Ensuite, je crois comprendre que tu utilise des masques binaires, si c'est bien le cas, tu peux te servir des opérandes binaires en PHP pour factoriser un max.

    Potasse un peu tout ça et reviens nous voir

  3. #3
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    Merci beaucoup pour ces quelques informations, j'ai donc encore un peu de lecture pour cette de journée.

    J'ai une autre version pas très optimisée, mais demandant moins de comparaison au niveau des ifs. Voici ce que cela donne :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    if( $carnaval == null ){
    	if( $apapier == null) {
    		if( $fpapier == null){
    			if( $tresor == null){
    				echo 'Erreur dans les reservation';
    				exit;
    			}
    			else{
    				$uttdebut = $utdebut;
    				$uttfin = $uttdebut + 3600;
    			}
    		}
    		else{
    			$utfpdebut = $utdebut;
    			$utfpfin = $utfpdebut + 3600;
    			if( $tresor != null){
    				$uttdebut = $utfpfin;
    				$uttfin = $uttdebut + 3600;
    			}
    		}
    	}
    	else{
    		$utapdebut = $utdebut;
    		$utapfin = $utapdebut + 3600;
    		if( $fpapier == null){
    			if( $tresor != null){
    				$uttdebut = $utapfin;
    				$uttfin = $uttdebut + 3600;
    			}
    		}
    		else{
    			$utfpdebut = $utapfin;
    			$utfpfin = $utfpdebut + 3600;
    			if( $tresor != null){
    				$uttdebut = $utfpfin;
    				$uttfin = $uttdebut + 3600;
    			}
    		}
    	}
    }
    else{
    	$utcdebut = $utdebut;
    	$utcfin = $utcdebut + 3600;
    	if( $apapier == null) {
    		if( $fpapier == null){
    			if( $tresor == null){
    				$uttdebut = $utcfin;
    				$uttfin = $uttdebut + 3600;
    			}
    		}
    		else{
    			$utfpdebut = $utcfin;
    			$utfpfin = $utfpdebut + 3600;
    			if( $tresor != null){
    				$uttdebut = $utfpfin;
    				$uttfin = $uttdebut + 3600;
    			}
    		}
    	}
    	else{
    		$utapdebut = $utcfin;
    		$utapfin = $utapdebut + 3600;
    		if( $fpapier == null){
    			if( $tresor != null){
    				$uttdebut = $utapfin;
    				$uttfin = $uttdebut + 3600;
    			}
    		}
    		else{
    			$utfpdebut = $utapfin;
    			$utfpfin = $utfpdebut + 3600;
    			if( $tresor != null){
    				$uttdebut = $utfpfin;
    				$uttfin = $uttdebut + 3600;
    			}
    		}
    	}
    }

    Bon, j'ai commencé à la rendre avant de voir le message, donc, je vous prie d'être indulgent.

    [EDIT]Pour info, le lien vers 11heaven est malheureusement kapout. La page n'existe plus sur le site en fait [/EDIT]

  4. #4
    Membre éclairé Avatar de Tillo
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2007
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 494
    Points : 683
    Points
    683
    Par défaut
    Bonsoir,

    C'est mieux mais ça fait encore un peu chargé, il faut une tu utilises case comme te l'a expliqué Benjamin.

    A bientôt,
    Alexis

  5. #5
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    Bonjour à tous,

    Alors me revoilà, j'ai bien compris que le fait de passer par un switch / case pouvait être beaucoup plus lisible au niveau du code. J'ai lu, il y a quelques jours sur un forum, que dans certains cas l'utilisation de if était plus rapide.

    Autre chose, Benjamin a parlé d'opérandes binaires pour le php pour factoriser un max. En fait, lorsque j'ai noté dans le code /*1010*/, je parle de 4 variables distinctes, mais n'ayant chacune que deux valeurs possible (0 ou 1).

    Ce matin, j'essaie donc de combiner ces variables dans l'ordre qui m'intéresse afin de pouvoir obtenir un semblant de quartet binaire. Au niveau de l'imbrication et de la combinaison des switch, je ne sais pas encore vraiment comment faire. Va falloir que je retourne en mode école, et que je sorte la feuille papier. AAAHHH, le papier, j'avais presque oublier que ça pouvait être pratique...

  6. #6
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    Heu... en relisant attentivement ton code, on peut en effet gravement l'optimiser.

    Je résume :
    * Tu as 4 variables en entrée :
    - Carnaval (C)
    - APapier (AP)
    - FPapier (FP)
    - Tresor (T)

    * Tu as 8 variables en sorties :
    - utXfin
    - utXdebut
    avec X valant C, AP, FP ou T

    Chaque fois qu'une variable C, AP, FP, T est renseignée, tu souhaites stocker $utdebut dans la variable utXdebut correspondante, et $utdebut+3600 dans la variable utXfin correspondante.

    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    if ($carnaval != null) {
      $utcdebut=$utdebut;
      $utcfin=$utdebut+3600;
    }
    if ($apapier != null) {
      $utapdebut=$utdebut;
      $utapfin=$utdebut+3600;
    }
    if ($fpapier != null) {
      $utfpdebut=$utdebut;
      $utfpfin=$utdebut+3600;
    }
    if ($tresor != null) {
      $uttdebut=$utdebut;
      $uttfin=$utdebut+3600;
    }
    Autrement dit : "Ce qui se conçoit bien s'énonce clairement" ;o)

  7. #7
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Autre chose, Benjamin a parlé d'opérandes binaires pour le php pour factoriser un max. En fait, lorsque j'ai noté dans le code /*1010*/, je parle de 4 variables distinctes, mais n'ayant chacune que deux valeurs possible (0 ou 1).
    C'est bien ce que je disait, tes 4 variables forment un bitfield de 4 bits.

    Voici comment je procéderai si j'étais toi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    define('CARNAVAL', 1);
    define('APAPIER', 2);
    define('FPAPIER', 4);
    define('TRESOR', 8);
     
    $flags = 3; // 0011
    if ($flags & CARNAVAL) {
      ...
    }

  8. #8
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    Hihi, oui, ce n'est pas aussi facile que cela en fait Fladnag.

    La chose ce conçoit différement.

    En fait, le début est tout à fait correcte, mais au niveau de l'assignation des heures de début et de fin de visite, cela s'avère un peu plus complexe.

    Si le flag carnaval est placé, la visite commencera automatiquement par là.

    Si le flag aPapier est placé, la visite si poursuit par là.

    Si le flag fPapier est placé, ...

    Si le flag Tresor est placé, on termine par là.

    Donc si carnaval n'est pas setté, mais que aPapier l'est, on commence par aPapier.

    Si ni carnaval ni aPapier sont settés, on commence par fPapier.

    Si ni carnaval, ni aPapier, ni fPapier sont settés, on commence par Trésor.

    bon, je pense que je ne saurais pas être plus clair de ce côté là...

  9. #9
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Aw, c'est pas simple de suivre ta logique, tu peux pas nous dessiner un AEF ? (automate à état fini).

  10. #10
    Membre confirmé Avatar de rikemSen
    Homme Profil pro
    Analyste Développeur Web - Fizzup.com
    Inscrit en
    Décembre 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste Développeur Web - Fizzup.com
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 387
    Points : 540
    Points
    540
    Par défaut
    Bon, on à du mal à comprendre. Même si pour toi ça parrait clair.

    Ne serait-ce pas plus simple que tu expliques ce que tu veux faire? Ce que ton "appli" doit faire?

    Avec comme dit b.d un AEF?

  11. #11
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    Ok, donc le plus lisible c'est de passer par des tableaux ;o)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    $tableau=array(
       'carnaval'=>array(),
       'apapier'=>array(), 
       'fpapier'=>array(),
       'tresor'=>array(),
    );
     
    $lastHeure=$utdebut;
     
    foreach($tableau as $variable => $heures) {
      if (isset($$variable)) {
        $heures['debut']=$lastHeure;
        $heures['fin']=$heures['debut']+3600;
        $lastHeure+=3600;
      }
    }
     
    echo '<pre>';
    var_dump($tableau);
    echo '</pre>';
    Si tu veux vraiment tes variables, tu peux faire du full dynamique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    $tableau=array(
       'carnaval'=>'utc',
       'apapier'=>'utap', 
       'fpapier'=>'utfp',
       'tresor'=>'utt',
    );
     
    $lastHeure=$utdebut;
     
    foreach($tableau as $variable => $heures) {
      if (isset($$variable)) {
        ${$variable.'debut'}=$lastHeure;
        $lastHeure+=3600; // petite optimisation gratuite en plus ;o)
        ${$variable.'fin'}=$lastHeure;
      }
    }

  12. #12
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    Me revoici,

    Alors en fait, il s'agit de réaliser une réservation de salles et d'ateliers pour des visites guidées. Le musée en question propose 4 salles et ateliers différents, qui peuvent être combiné dans la visite.

    Les salles et atelier qu'il est possible de visiter sont :
    • L'atelier du Carnaval
    • L'atelier du Papier
    • La Fabrication du Papier
    • Le Trésor de la Cathédrale


    Un visiteur peut choisir le réaliser une visite de n'importe laquelle de ces ressources. Afin de noter si une visite est demandée ou non, les valeurs 1 ou 0 sont respectivement renseignées. Chaque visite dure 1heure (soit 3600 secondes). donc si le visiteur choisit de visiter "l'Atelier du Carnaval" et "La Fabrication du Papier", il aura demandé 2 visites de 1 heure, soit 2 heures de visite.

    Maintenant, voilà le hic. Lorsqu'une personne demande la visite de plusieurs ressources, la visite doit se dérouler dans l'ordre de la liste renseignée plus haut, à savoir, si elle demande de visiter "l'Atelier du Carnaval" et "La Fabrication du Papier" à partir de 13h, elle commencera sa visite à 13h avec l'Atelier du Carnaval, et poursuivra par la Fabrication du Papier une heure plus tard à savoir à 14h.

    Voilà, je pense que l'explication fournies permet de beaucoup mieux comprendre ce que je cherche à faire.

    Je viens également de regarder d'un peu plus près le code de Fladnag, et il semble que cela pourrait marcher. Je vais plonger encore un peu plus dedans, en essayer de ne pas me noyer, et je vous retiens au courant.

    Merci en tout cas pour les infos utiles et pratique que vous m'avez fournies, et passer tous une bonne journée.

  13. #13
    Membre confirmé Avatar de rikemSen
    Homme Profil pro
    Analyste Développeur Web - Fizzup.com
    Inscrit en
    Décembre 2007
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste Développeur Web - Fizzup.com
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 387
    Points : 540
    Points
    540
    Par défaut
    Bah...

    tu fais des checkbox, tu affectes une valeur numérique à tes checkbox:

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <input type="checkbox" name="visite[]" value="1" /> <- papier<br />
    <input type="checkbox" name="visite[]" value="2" /> <- trésor<br />

    Et tu récupères ces valeurs qui sont dans un tableau. Tu tries en ordre croissant pour savoir d’où ça commence et pour savoir combien de temps ça dure tu fais un count($_POST['visite']) qui t'indiquera le nombre de visite coché. Donc exemple 3 * 3600...

    Tu t’embêtes trop je pense.

    ___

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?php
    	if(filter_has_var(INPUT_POST, 'valid')){
    		$array_visite = array(1 => 'Atelier Carnaval', 2 => 'Aterlier papier', 3 => 'Fabrication papier', 4 => 'Trésor cathédrale');
    		echo 'La personne a choisi de visiter: ';
    		foreach($_POST['visite'] as $visite){
    			echo $array_visite[(int)$visite].', ';
    		}
    		$time = count($_POST['visite']) * 3600;
    		echo '<br />La visite durera donc: '.$time.'s ou '.count($_POST['visite']).'h, comme vous voulez';
    	}else{
     
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
     
    <head> 
    </head> 
     
    <body> 
    	<form action="./index.php" method="post">
    		<input type="checkbox" name="visite[]" value="1" /> Atelier Carnaval<br />
    		<input type="checkbox" name="visite[]" value="2" /> Atelier du papier<br />
    		<input type="checkbox" name="visite[]" value="3" /> Fabrication du papier<br />
    		<input type="checkbox" name="visite[]" value="4" /> Trésor de la cathédrale<br />
    		<input type="submit" value="reserver" name="valid" />
    	</form>
    </body> 
    </html> 
    <?php
    }
    ?>
    Ceci est un exemple... Il n'y a pas la gestion des heures. Mais la gestion de l'ordre des visites y est...

  14. #14
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    Merci pour cette proposition RadicalDreamer, mais je n'arrive pas à trouver de solution pour gérer mes heures dans la version proposée.

    Mais je me suis encore un peu creusé la tête, et je pense avoir une bonne piste, sans trop me prendre la tête.

    Je souhaite passer par une variable "facteur". Je m'explique, cette variable me permettra de comptabiliser le nombre de visite et de calculer les heures de début et de fin pour chaque visite.

    J'ai pas encore tout fini au niveau du code, mais ça donnerai quelque chose dans le style

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    $facteur = 0;
    $cardebut = (($facteur * 3600) + $heuredebutvisite ) * $flagcarnaval;
    $facteur = $facteur + $flagcarnaval;
    $carfin = (($facteur * 3600) + $heuredebutvisite ) * $flagcarnaval;
     
    $apapdebut = (( $facteur * 3600) + $heuredebutvisite ) * $flagapapier;
    $facteur = $facteur + $flagapapier;
    $apapfin = (( $facteur * 3600 ) + $heuredebutvisite ) * $flagapapier;
     
    $fpapdebut = (($facteur * 3600) + $heuredebutvisite) * $flagfpapier;
    $facteur = $facteur + $flagfpapier;
    $fpapfin = (($facteur * 3600 ) + $heuredebutvisite ) * $flagfpapier;
     
    $tresdebut = (($facteur * 3600) + $heuredebutvisite ) * $flagtresor;
    $facteur = $facteur + $flagtresor;
    $tresfin = (( facteur * 3600) + $heuredebutvisite ) * $flagtresor;

    Maintenant, si je réussi à placer l'ensemble intelligemment dans une boucle, je pense obtenir le meilleur résultat. Et wahou, je me rends compte qu'on est bien loin de la première version de l'ensemble de if imbriqué, ou encore de la série switch / case.

    Bon, je m'y atèle.

    Encore merci pour toutes les idées proposées, et bonne après midi à tout le monde.

  15. #15
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    Bonjour à tous,

    Ce matin je suis super motivé, et pourtant je n'ai pas de temps...

    Voici donc le code que je viens de mettre en place pour mes besoins, et je suis certain que je peux encore faire mieux, avec votre aide bien sûr :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $facteur = 0;
    $visite = array($carnaval, $apapier, $fpapier, $tresor);
    $heuresdebut = array(0,0,0,0);
    $heuresfin = array(0,0,0,0);
    foreach($visite as $key => $flag){
    	$heuresdebut[$key] = (($facteur * 3600) + $utdebut) * $flag;
    	$facteur = $facteur + $flag;
    	$heuresfin[$key] = (($facteur * 3600) + $utdebut) *$flag;
    }

  16. #16
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    Je passais par là et je te propose une autre soluce. En espérant avoir bien compris ta problématique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    /**
     * Etapes du circuit des visites: codes identification et ordre de visite
     */
    $circuit = array('01' => array('nom' => 'atelier du carnaval', 'duree' => 3600),
                     '02' => array('nom' => 'atelier du papier', 'duree' => 3600),
                     '03' => array('nom' => 'fabrication du papier', 'duree' => 3600),
                     '04' => array('nom' => 'trésor de la cathédrale', 'duree' => 3600));
     
    /**
     * d'après tes explications : 
     * tu n'as besoin que de deux éléments en provenance du $_POST :
     *  - l'heure de début de la visite 
     *  - les codes d'identification du circuit
     * Ensuite en interne tu gères les durées et l'ordre imposé des visites 
     * Le circuit une fois démarré ne peut s'interrompre (les visites des ateliers s'enchainent)
     * Je passe les tests de sécurité sur les données reçues
     */
    $hDebut = $_POST['hdebut'] * 3600; // je suppose que l'heure de début reçue est da la forme 14 pour 14h
    $etapes = sort($_POST['etapes'], SORT_STRING); // on trie les étapes pour respecter l'ordre imposé de la visite
     
    foreach ($etapes as $etape) {
       $visite[$etape][$hDebut]['nb'] += 1;  // nombre de visites pour une heure spécifique
       $hDebut += $circuit[$etape]['duree']; // on décale l'heure de début de la prochaine étape de la durée nécessaire à l'étape en cours
    }
     
    // ensuite pour l'heure de fin ce n'est que du calcul de base : pas besoin de suivre les heures de fin à chaque tour
    Bon courage

Discussions similaires

  1. [XL-2010] Aide pour optimisation code VBA
    Par adelas93 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/11/2014, 13h56
  2. Besoin d'aide pour optimiser un code
    Par petitprince dans le forum Langage
    Réponses: 39
    Dernier message: 11/08/2009, 01h43
  3. [JAVA / Out Of Memory] Aide pour optimiser du code
    Par shaun_the_sheep dans le forum Général Java
    Réponses: 7
    Dernier message: 06/02/2007, 09h58
  4. Besoin d'aide pour optimiser du code
    Par scaleo dans le forum Langage
    Réponses: 1
    Dernier message: 07/01/2007, 13h56
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo