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 :

Imbrication If en fonction


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Imbrication If en fonction
    Bonjour à tous !
    Je me retrouve devant un problème de conception que je n'arrive pas à solutionner de manière correcte.
    J'espère donc que vous pourrez m'aider, en tout cas je vous remercie d'avance de l'attention que vous porterez à mon problème.

    Je m'explique donc :

    Nom : 18239782ex.png
Affichages : 180
Taille : 819,0 Ko

    Le script doit afficher 3 travaux de développement par ligne et ensuite 2 de Webdesign.

    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
    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
    117
    118
     
    <?php
    $nbreTravaux = count($data);
    $nbrePagesDansLaBoucle = ceil($nbreTravaux/5);
    // On divise par 5 le nbre de travaux et on arrondit au dessus
    // On obtient le nbre de fois que e doit s'executer pour afficher tous les travaux
     
    for($e=0;$e<$nbrePagesDansLaBoucle;$e++)
    {
    	?>
    	<div class="row-fluid">
    		<?php
    		$maxWorkParLignesDev = 3;
    		$f = 0; /* F = incremential variable for know how development categorie were displayed */
    		$_SESSION['worksUsedByDev'] = array();
     
    		for($numero = 0; $numero < $nbreTravaux; $numero++)
    		{
    			// Si la catégorie est Developpement et qu'il n'y a pas encore 3 travaux
    			if($data[$numero][1] == "1" && $f != $maxWorkParLignesDev)
    			{
    				if($e == 0)
    				{
    					$_SESSION['worksUsedByDev1']['work_'.$f] = $data[$numero]['id'];
     
    					$this->blocDevelopment($data, $numero);
    					$f++;
    				}
    				elseif($e == 1)
    				{
    					$_SESSION['worksUsedByDev2']['work_'.$f] = $data[$numero]['id'];
    					if($data[$numero]['id'] != $_SESSION['worksUsedByDev1']['work_0'] && $data[$numero]['id'] != $_SESSION['worksUsedByDev1']['work_1'] && $data[$numero]['id'] != $_SESSION['worksUsedByDev1']['work_2'])
    					{
    						$this->blocDevelopment($data, $numero);
    						$f++;
    					}
    				}										
    				elseif($e == 2)
    				{
    					$_SESSION['worksUsedByDev3']['work_'.$f] = $data[$numero]['id'];
    					if($data[$numero]['id'] != $_SESSION['worksUsedByDev1']['work_0'] && $data[$numero]['id'] != $_SESSION['worksUsedByDev1']['work_1'] && $data[$numero]['id'] != $_SESSION['worksUsedByDev1']['work_2'])
    					{
    						if($data[$numero]['id'] != $_SESSION['worksUsedByDev2']['work_0'] && $data[$numero]['id'] != $_SESSION['worksUsedByDev2']['work_1'] && $data[$numero]['id'] != $_SESSION['worksUsedByDev2']['work_2'])
    						{												
    								$this->blocDevelopment($data, $numero);
    								$f++;
    						}
    					}
    				}										
    				elseif($e == 3)
    				{
    					$_SESSION['worksUsedByDev4']['work_'.$f] = $data[$numero]['id'];
    					if($data[$numero]['id'] != $_SESSION['worksUsedByDev1']['work_0'] && $data[$numero]['id'] != $_SESSION['worksUsedByDev1']['work_1'] && $data[$numero]['id'] != $_SESSION['worksUsedByDev1']['work_2'])
    					{
    						if($data[$numero]['id'] != $_SESSION['worksUsedByDev2']['work_0'] && $data[$numero]['id'] != $_SESSION['worksUsedByDev2']['work_1'] && $data[$numero]['id'] != $_SESSION['worksUsedByDev2']['work_2'])
    						{													
    							if($data[$numero]['id'] != $_SESSION['worksUsedByDev3']['work_0'] && $data[$numero]['id'] != $_SESSION['worksUsedByDev3']['work_1'] && $data[$numero]['id'] != $_SESSION['worksUsedByDev3']['work_2'])
    							{												
    									$this->blocDevelopment($data, $numero);
    									$f++;
    							}
    						}
    					}
    				}
    			}
    		}
    		?>
    	</div>
     
    	<div class="row-fluid">
    		<?php
    		$maxWorkParLignesWebdesign = 2;
    		$f = 0; /* F = incremential variable for know how development categorie were displayed */
    		$_SESSION['worksUsedByWebdesign'] = array();
     
    		for($numero = 0; $numero < $nbreTravaux; $numero++)
    		{
    			// Si la catégorie est Webdesign ou Autres et qu'il n'y a pas encore 2 travaux
    			if($data[$numero][1] == "2" || $data[$numero][1] == "3")
    			{
    				if($f != $maxWorkParLignesWebdesign)
    				{
    					if($e == 0)
    					{
    						$_SESSION['worksUsedByWebdesign1']['work_'.$f] = $data[$numero]['id'];
     
    						$this->blocWebdesign($data, $numero);
    						$f++;
    					}
    					elseif($e == 1)
    					{
    						$_SESSION['worksUsedByWebdesign2']['work_'.$f] = $data[$numero]['id'];
    						if($data[$numero]['id'] != $_SESSION['worksUsedByWebdesign1']['work_0'] && $data[$numero]['id'] != $_SESSION['worksUsedByWebdesign1']['work_1'])
    						{
    							$this->blocWebdesign($data, $numero);
    							$f++;
    						}
    					}											
    					elseif($e == 2)
    					{
    						$_SESSION['worksUsedByWebdesign3']['work_'.$f] = $data[$numero]['id'];
    						if($data[$numero]['id'] != $_SESSION['worksUsedByWebdesign1']['work_0'] && $data[$numero]['id'] != $_SESSION['worksUsedByWebdesign1']['work_1'])
    						{
    							if($data[$numero]['id'] != $_SESSION['worksUsedByWebdesign2']['work_0'] && $data[$numero]['id'] != $_SESSION['worksUsedByWebdesign2']['work_1'])
    							{
    								$this->blocWebdesign($data, $numero);
    								$f++;
    							}
    						}
    					}
    				}
    			}
    		}
    		?>
    	</div>
    	<?php
    }
    ?>
    Pour le moment, je suis obligé d'ajouter manuellement des conditions $e == 1, $e == 2 pour chaque tour que fera la boucle e et pour les différents types de travaux.

    Je voudrais donc simplifier celà et créer une fonction qui permettrait l'ajout automatique des imbrications de if.

    Un exemple de ce que en gros je voudrais arriver à faire :

    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
    33
    34
    35
    36
    <?php
    for($e=0;$e<$nbrePagesDansLaBoucle;$e++)
    {
    	for($numero = 0; $numero < $nbreTravaux; $numero++)
    	{
    		// Si la catégorie est Developpement et qu'il n'y a pas encore 3 travaux
    		if($data[$numero][1] == "1" && $f != $maxWorkParLignesDev)
    		{
    			$nbreE = $e++;
    			$id = $data[$numero]['id'];
    			$categorie = $data[$numero][1];
     
    			$_SESSION['worksUsedByDev'.$nbreE]['work_'.$f] = $data[$numero]['id'];
     
    			// Fonction qui permettrait de mettre autant de if qu'il le faudrait de manière automatique
    			$modelTravaux->imbriquerIf($e, $categorie, $this->blocDevelopment($data, $numero), $f);
     
    		}		
     
    		// Si la catégorie est Developpement et qu'il n'y a pas encore 3 travaux
    		if($data[$numero][1] == "2" || $data[$numero][1] == "3")
    		{
    			if($f != $maxWorkParLignesWebdesign)
    			{
    			$nbreE = $e++;
    			$id = $data[$numero]['id'];
    			$categorie = $data[$numero][1];
     
    			$_SESSION['worksUsedByWebdesign'.$nbreE]['work_'.$f] = $data[$numero]['id'];
     
    			// Fonction qui permettrait de mettre autant de if qu'il le faudrait de manière automatique
    			$modelTravaux->imbriquerIf($e, $categorie, $this->blocDevelopment($data, $numero), $f);
    			}
    		}
    	}
    ?>
    Je ne demande pas une solution toute faite bien évidemment, je voudrais simplement comprendre de quelle manière il est possible de résoudre celà.
    Je vous remercie !

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Enregistre tes différents travaux dans une table de bdd, cela te permettras de faire facilement le tri pour l'affichage.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    quand on arrive à construire une telle usine à gaz, le problème de conception est sérieux !

    Pour chaque ligne :
    il doit être possible de sélectionner 3 "travaux" distincts, non ? (sans faire 10000 boucles if)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    @ABCIWEB :
    C'est déjà ce que je fais, la variable $data étant le tableau du modèle qui récupèrent tous les travaux.

    @jreaux62 :
    C'est en effet l'idée que je voulais réaliser, mais je ne vois pas comment faire celà grâce à la requête SQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	public function lesTravaux()
    	{
    		$req = "SELECT tr.id, tr.categorie, tr.titre, tr.description, tr.contenu, tr.lien_demo, tr.lien_download, tr.images, tr.open_source, tr.temps_pris, tr.compagnie, tr.compagnie_site, tr.date_ajout, c.categorie
    		FROM travaux tr 
    		LEFT JOIN categories c 
    		ON tr.categorie = c.id
    		ORDER BY id DESC";
    		$data = modelTravaux::$pdo->query($req)->fetchAll();
     
    		$this->data = $data;
    	}
    Faudrait-il que je crée le foreach qui crée le tableau de donnée dans le modèle? ?
    Je sélectionnerais alors sur un argument, mais celui ne changerait pas la requête, juste les conditions du foreach.
    Donc au fond, je pense que j'en reviendrais au même problème...

  5. #5
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Tu peux créer un tableau de résultat intermédiaire plutôt que d'essayer d'exploiter directement le contenu de ta requête, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $tab_result = array();
    foreach($this->data as $value)
    {
        $tab_result[$value->categorie][] = $value->titre;
    }
     
    //pour voir comment exploiter le tableau
    echo '<pre>';
    print_r($tab_result);
    echo '</pre>';

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Génial, c'est exactement ça.

    J'avais pourtant essayé dans cette voie, mais je n'avais pas pensé à cette façon de faire.
    Tu me débloques plus que pour ce script, c'est un concept de base que je vais tâcher d'intégrer au plus vite

    Bien à vous

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Ps :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach($data as $value)
    {
    	$tri_donnees['id'][$value['id']] = $value['categorie'];
    }
    Les deux crochets après le tableau étaient de trop, cela ajoutait un champ de trop.

    PS2: En fin de compte, pas vraiment inutile, puisque ça me permet de sélectionner les champs du tableau par leur réelle id.

  8. #8
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par misternono Voir le message
    J'avais pourtant essayé dans cette voie, mais je n'avais pas pensé à cette façon de faire.
    Tu me débloques plus que pour ce script, c'est un concept de base que je vais tâcher d'intégrer au plus vite
    Et oui la création et la manipulation des tableaux est un élément de base en php, notamment pour exploiter les résultats d'une requête, mais plus généralement pour faire des tris, des regroupements, appliquer des fonctions sur chaque élément d'un tableau, etc, etc.
    Bosser les tableaux, c'est le ticket d'entrée en php sinon on se retrouve vite avec un code improbable et quasi insoluble tel que le bin's de ton premier essai... Alors qu'avec une utilisation judicieuse des tableaux, l'horizon s'éclaircit et tout d'un coup on se sent pousser des ailes

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Oui exactement, cela résous pas mal de problèmes.
    Mais sinon, je ne suis pas débutant en développement, c'est juste que ayant tout appris de manière autodidacte, il y a parfois des procédés que j'emploie qui sont incorrects.
    Mais depuis que je me suis mis à la pdo, poo et mvc ( avant en pur procédural ), je commence à m'intéresser à des concepts de programmation plus avancés.

    Et bien évidemment, c'est très appréciable de sentir son niveau évoluer, en partie grâce à vous cette fois !

    Bien à vous, bonne soirée

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Pour donner une réponse complète pour les prochaines personnes qui auraient le problème :

    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
    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
     
    <?php
    $usedDev = array();
    $usedWebd = array();
     
    for($e=0;$e<$nbrePagesDansLaBoucle;$e++)
    {
    	$maxWorkParLignesDev = 3;
    	$maxWorkParLignesWebdesign = 2;
    	$g = 0;
    	$f = 0; /* F = incremential variable for know how development categorie were displayed */
     
    	?>
    	<div class="row-fluid">
    		<?php								
    		foreach($tri_donnees as $numTravail => $travailDev)
    		{
    			// echo $numTravail; // INDEX DU TABLEAU PR RECUP L ID DU TAFF PAR RAPPORT A LA REQUETE
    			// print_r($travailDev['id']); // ID DU TRAVAIL DS LA BDD
    			// Si la catégorie est Developpement et qu'il n'y a pas encore 3 travaux
    			if($travailDev['categorie'] == "Developpement" && $f != $maxWorkParLignesDev)
    			{
     
    				if(!in_array($numTravail, $usedDev))
    				{
     
    					$this->blocDevelopment($data[$numTravail], $data_sous_cat);
    					$f++;
     
    					$usedDev[$numTravail] = $numTravail;
    					unset($tri_donnees[$numTravail]);
    				}
    			}
    		}
    		?>
    	</div>
    	<div class="row-fluid">
    		<?php
    		foreach($tri_donnees as $numTravail => $travailWebd)
    		{
    			if($g != $maxWorkParLignesWebdesign)
    			{
    				if($travailWebd['categorie'] == "Webdesign" || $travailWebd['categorie'] == "Autres")
    				{
    					if(!in_array($numTravail, $usedWebd))
    					{
    						$this->blocWebdesign($data[$numTravail], $data_sous_cat);
    						$g++;
     
    						$usedWebd[$numTravail] = $numTravail;
    						unset($tri_donnees[$numTravail]);
    					}
    				}
    			}
    		}
    		?>
    	</div>
    	<?php
    }
    ?>

  11. #11
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Cela sent encore beaucoup le bricolage.

    Il faut créer les tableaux en fonction de ce que tu as besoin. Dans ton cas il aurait été plus simple (à première vue) d'avoir à lister les tableaux $travail['Webdesign'], $travail['Developpement'] et $travail['autre']. Donc la logique de ton code aurait dû être orientée vers la création de ces tableaux... (ce qui aurait été aussi un bon exercice).

Discussions similaires

  1. Fonction SI et limite niveau imbrication
    Par dimitri70 dans le forum Excel
    Réponses: 1
    Dernier message: 30/07/2013, 14h21
  2. Imbrication de fonction avec calcul sur date
    Par blazko49 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/01/2013, 15h19
  3. Fonction template recursive, avec imbrication de types
    Par YéTeeh dans le forum Langage
    Réponses: 5
    Dernier message: 28/04/2006, 17h02
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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