Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/04/2011, 16h20   #1
Membre habitué
 
Avatar de richard_sraing
 
Homme Raphaël
Responsable de service informatique
Inscription : avril 2005
Messages : 374
Détails du profil
Informations personnelles :
Nom : Homme Raphaël
Localisation : Belgique

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

Informations forums :
Inscription : avril 2005
Messages : 374
Points : 121
Points : 121
Envoyer un message via MSN à richard_sraing
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 :
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.
__________________
First step: F.A.Q.
Second step: Forum -> Recherche
Thrid step: Forum -> Poser une question
Fourth step: Forum -> Attendre une réponse
Fifth step: Forum -> Remercier les personnes ayant répondu et signaler comme résolu

Simple non ? l'utilisation de developpez.com
richard_sraing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 16h42   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Citation:
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 :
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
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 16h47   #3
Membre habitué
 
Avatar de richard_sraing
 
Homme Raphaël
Responsable de service informatique
Inscription : avril 2005
Messages : 374
Détails du profil
Informations personnelles :
Nom : Homme Raphaël
Localisation : Belgique

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

Informations forums :
Inscription : avril 2005
Messages : 374
Points : 121
Points : 121
Envoyer un message via MSN à richard_sraing
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 :
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]
__________________
First step: F.A.Q.
Second step: Forum -> Recherche
Thrid step: Forum -> Poser une question
Fourth step: Forum -> Attendre une réponse
Fifth step: Forum -> Remercier les personnes ayant répondu et signaler comme résolu

Simple non ? l'utilisation de developpez.com
richard_sraing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 18h58   #4
Membre habitué
 
Homme Alexis Amand
pitête développeur....
Inscription : octobre 2007
Messages : 140
Détails du profil
Informations personnelles :
Nom : Homme Alexis Amand
Âge : 32
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : pitête développeur....

Informations forums :
Inscription : octobre 2007
Messages : 140
Points : 116
Points : 116
Envoyer un message via MSN à tabouet Envoyer un message via Yahoo à tabouet
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
__________________
J'aimerais mieux être le premier dans ce village que le second à Rome. (Caius Julius Caesar)

Je vous emmène en voyage sur la Route 66
ou sur mon mon site pro (qui est en pleine restructuration car il est toupouri)
tabouet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 08h17   #5
Membre habitué
 
Avatar de richard_sraing
 
Homme Raphaël
Responsable de service informatique
Inscription : avril 2005
Messages : 374
Détails du profil
Informations personnelles :
Nom : Homme Raphaël
Localisation : Belgique

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

Informations forums :
Inscription : avril 2005
Messages : 374
Points : 121
Points : 121
Envoyer un message via MSN à richard_sraing
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...
__________________
First step: F.A.Q.
Second step: Forum -> Recherche
Thrid step: Forum -> Poser une question
Fourth step: Forum -> Attendre une réponse
Fifth step: Forum -> Remercier les personnes ayant répondu et signaler comme résolu

Simple non ? l'utilisation de developpez.com
richard_sraing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 08h46   #6
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
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 :
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)
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 09h41   #7
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Citation:
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 :
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) {
  ...
}
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/04/2011, 10h32   #8
Membre habitué
 
Avatar de richard_sraing
 
Homme Raphaël
Responsable de service informatique
Inscription : avril 2005
Messages : 374
Détails du profil
Informations personnelles :
Nom : Homme Raphaël
Localisation : Belgique

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

Informations forums :
Inscription : avril 2005
Messages : 374
Points : 121
Points : 121
Envoyer un message via MSN à richard_sraing
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à...
__________________
First step: F.A.Q.
Second step: Forum -> Recherche
Thrid step: Forum -> Poser une question
Fourth step: Forum -> Attendre une réponse
Fifth step: Forum -> Remercier les personnes ayant répondu et signaler comme résolu

Simple non ? l'utilisation de developpez.com
richard_sraing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 11h03   #9
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Aw, c'est pas simple de suivre ta logique, tu peux pas nous dessiner un AEF ? (automate à état fini).
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 11h11   #10
Membre éprouvé
 
Avatar de radicaldreamer
 
Homme Guillaume
Développeur Web
Inscription : décembre 2007
Messages : 353
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 21
Localisation : France, Haut Rhin (Alsace)

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

Informations forums :
Inscription : décembre 2007
Messages : 353
Points : 473
Points : 473
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?
__________________
Si ce que tu as à dire n'est pas plus beau que le silence, alors tais toi.

- Pensez à voter pour les messages qui vous ont été utiles ainsi que de mettre
radicaldreamer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 12h53   #11
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
Ok, donc le plus lisible c'est de passer par des tableaux ;o)

Code :
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 :
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;
  }
}
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 13h52   #12
Membre habitué
 
Avatar de richard_sraing
 
Homme Raphaël
Responsable de service informatique
Inscription : avril 2005
Messages : 374
Détails du profil
Informations personnelles :
Nom : Homme Raphaël
Localisation : Belgique

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

Informations forums :
Inscription : avril 2005
Messages : 374
Points : 121
Points : 121
Envoyer un message via MSN à richard_sraing
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.
__________________
First step: F.A.Q.
Second step: Forum -> Recherche
Thrid step: Forum -> Poser une question
Fourth step: Forum -> Attendre une réponse
Fifth step: Forum -> Remercier les personnes ayant répondu et signaler comme résolu

Simple non ? l'utilisation de developpez.com
richard_sraing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 14h22   #13
Membre éprouvé
 
Avatar de radicaldreamer
 
Homme Guillaume
Développeur Web
Inscription : décembre 2007
Messages : 353
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 21
Localisation : France, Haut Rhin (Alsace)

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

Informations forums :
Inscription : décembre 2007
Messages : 353
Points : 473
Points : 473
Bah...

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

Code html :
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 :
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...
__________________
Si ce que tu as à dire n'est pas plus beau que le silence, alors tais toi.

- Pensez à voter pour les messages qui vous ont été utiles ainsi que de mettre
radicaldreamer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 15h27   #14
Membre habitué
 
Avatar de richard_sraing
 
Homme Raphaël
Responsable de service informatique
Inscription : avril 2005
Messages : 374
Détails du profil
Informations personnelles :
Nom : Homme Raphaël
Localisation : Belgique

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

Informations forums :
Inscription : avril 2005
Messages : 374
Points : 121
Points : 121
Envoyer un message via MSN à richard_sraing
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 :
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.
__________________
First step: F.A.Q.
Second step: Forum -> Recherche
Thrid step: Forum -> Poser une question
Fourth step: Forum -> Attendre une réponse
Fifth step: Forum -> Remercier les personnes ayant répondu et signaler comme résolu

Simple non ? l'utilisation de developpez.com
richard_sraing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 09h03   #15
Membre habitué
 
Avatar de richard_sraing
 
Homme Raphaël
Responsable de service informatique
Inscription : avril 2005
Messages : 374
Détails du profil
Informations personnelles :
Nom : Homme Raphaël
Localisation : Belgique

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

Informations forums :
Inscription : avril 2005
Messages : 374
Points : 121
Points : 121
Envoyer un message via MSN à richard_sraing
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 :
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;
}
__________________
First step: F.A.Q.
Second step: Forum -> Recherche
Thrid step: Forum -> Poser une question
Fourth step: Forum -> Attendre une réponse
Fifth step: Forum -> Remercier les personnes ayant répondu et signaler comme résolu

Simple non ? l'utilisation de developpez.com
richard_sraing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 12h27   #16
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 548
Points : 2 548
Envoyer un message via Skype™ à rawsrc
Bonjour,

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

Code :
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
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h58.


 
 
 
 
Partenaires

Hébergement Web