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 :

Quelle est la bonne pratique de mise en page pour long if


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut Quelle est la bonne pratique de mise en page pour long if
    Bonjour.

    J'ai une petite question concernant la bonne pratique pour la "mise en page" (je ne suis pas sûr que ce soit le bon terme) du code dans le cas d'un if assez long.
    Je m'explique, je dois faire un test sur des données postées d'un formulaire.
    J'ai des arrays et je suis dans l'impossibilité de les tester avec "empty" comme ils sont issues du formulaire.

    Je me demande donc quelle est la meilleur pratique.
    Faut-il mieux avoir un if long comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(empty($_POST['id']) && empty($_POST['num']) && empty(array_filter($_POST['bb'])) && empty(array_filter($_POST['aa'])) && empty(array_filter($_POST['b4'])) && empty(array_filter($_POST['b5'])) && empty(array_filter($_POST['b6'])) && empty(array_filter($_POST['b8'])) && empty(array_filter($_POST['a8'])) && empty(array_filter($_POST['a9'])) && empty(array_filter($_POST['a0'])) && empty(array_filter($_POST['a1'])) && empty(array_filter($_POST['a2']))) {
    ou mettre les arrays dans des variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $tcPOST = array_filter($_POST['tc']);
    				$bbPOST = array_filter($_POST['bb']);
    				$aaPOST = array_filter($_POST['aa']);
    				$a1POST = array_filter($_POST['a1']);
    				$a2POST = array_filter($_POST['a2']);
    				$a3POST = array_filter($_POST['a3']);
    				$b1POST = array_filter($_POST['b1']);
    				$b2POST = array_filter($_POST['b2']);
    				$b3POST = array_filter($_POST['b3']);
    				$b4POST = array_filter($_POST['b4']);
    				$b5POST = array_filter($_POST['b5']);
     
    				if(empty($_POST['id']) && empty($_POST['num']) && empty($bbPOST) && empty($aaPOST) && empty($a1POST) && empty($a2POST) && empty($a3POST) && empty($b1POST) && empty($b2POST) && empty($b3POST) && empty($b4POST) && empty($b5POST) ) {
    Si quelqu'un peut me dire comment faut-il mieux procéder, ce serait gentil.

    Merci.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    pourquoi as-tu besoin d'utiliser array_filter() ?
    Tu veux tester que TOUTES les valeurs reçues pour chaque array ne sont pas vide ?

    Sinon, pour chaque array, si tu veux AU MOINS une valeur, empty suffit.

    D'autre part, on peut simplifier l'écriture :
    if( !empty( $var1, $var2, $array1, $array2,......... ) ){
    Dernière modification par Invité ; 28/09/2015 à 13h12.

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 241
    Points
    20 241
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    D'autre part, on peut simplifier l'écriture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( !empty( $var1, $var2, $array1, $array2,......... ) ){
    empty() ne supporte pas plusieurs paramètres

  4. #4
    Invité
    Invité(e)
    Par défaut
    Oups! J'ai naïvement cru qu'il fonctionnait comme isset().

    Voilà une modification à prévoir pour PHP 8 !



    OK. Je remballe mes gaules...

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Bonjour et merci pour vos réponses.

    Effectivement je veux tester si toutes mes valeurs sont bien vides.
    Dans un 1er temps j'avais utilisé empty mais les arrays provenant d'un formulaire, ils ne sont jamais vide. J'ai donc vu que l'utilisation d'array_filter sans callback permet de suppimer les "vides"(en plus des 0, FALSE), seulement l'utilisation de cette fonction rallonge encore mon if (qui n'étais pas court de base). C'est pour ça que je demande si il y a une meilleur façon de procéder ou sinon de savoir s'il fallait mettre les $_POST filtrés dans des variables pour raccourcir le if ou tout laisser en brut dans le if.

    La condition fonctionne bien, c'est plus une question sur la "bonne pratique" qui donne un code plus propre.

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 241
    Points
    20 241
    Par défaut
    Tu t'en rend compte, une multitude de condition est illisible.
    Dans ce cas il est sans doute plus judicieux de dédier une fonction à la tache.

    Quelque chose comme ça devrait faire le job (pas testé)

    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
    if(areFieldsEmpty()) {
        //....
    }
     
    function areFieldsEmpty() {
        foreach($_POST as $field) {
    		$result = null;
    		if(is_array($field)) {
    			$result = empty(array_filter($field));
    		} else {
    			$result = empty($field);
    		}
     
    		if(!$result)
    			return false;
        }
     
    	return true;
    }

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Merci pour votre réponse.

    Effectivement le fait de passer par une boucle et de ce servir du retour de la fonction pour la condition est plus pratique.
    J'essaie d'utiliser des boucles de plus en plus pour rendre mon code le plus lisible possible, mais je n'ai pas toujours le reflex (ça va venir).

    Merci encore et bonne journée

  8. #8
    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
    Salut,

    juste en passant,

    il est simple d'y parvenir en utilisant la puissance des fonctions tableaux de PHP :
    Quelque chose dans ce genre :
    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
    // suppose que tu aies des données de cet acabit
    // et que tu ne veuilles conserver que les données  !empty()
    $data = [
        'tc' => [],
        'bb' => [1, 2, 3],
        'aa' => [],
        'a1' => [],
        'a2' => [4, false, 6],
        'a3' => [],
        'b1' => [],
        'b2' => [],
        'b3' => [7, 8, false],
        'b4' => [],
        'b5' => []
    ];
     
    // ici tu listes les clés qui subiront le traitement afin de ne pas impacter les autres
    $keys = ['tc', 'bb', 'aa', 'a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'b4', 'b5'];
    // et là tu extrais et filtres en une passe
    $x = array_filter(array_map('array_filter', array_intersect_key($data, array_flip($keys))));
    Tu obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $x = [
        'bb' => [1, 2, 3],
        'a2' => [4, 6],
        'b3' => [7, 8]
    ];
    Plus simple je ne vois pas...

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Dans un 1er temps j'avais utilisé empty mais les arrays provenant d'un formulaire, ils ne sont jamais vide.
    Je ne comprends pas cette assertion :
    - si l'utilisateur ne remplit rien, ça sera empty
    - si l'utilisateur met 0, ça sera empty
    - si l'utilisateur modifie le formulaire en retirant le champs, ça sera empty

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Bonjour et merci pour les réponses.

    @Sabotage
    Je ne comprends pas car quand je fais un test du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(empty($_POST['a1']))
    	echo "vide";
    avec a1 issue d'un formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <form>
    	<input id="a1_1" type="text"  name="a1[]" />
    	-> 
    	<input id="a1_2" type="text"  name="a1[]" /> 
    </form>
    si je ne remplie pas les champs, le test n'est pas validé même quand je met les champs à 0 (à moins que je fasse une mauvaise utilisation de "empty").
    C'est pourquoi j'utilise array_filter.

  11. #11
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 241
    Points
    20 241
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Plus simple je ne vois pas...
    Un code concis est rarement très lisible. 4 fonctions imbriquées ça demande quand même une certaines gymnastique d'esprit quand tu dois le relire

  12. #12
    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
    @grunk

    ouaip, mais ça dépend si tu as fait ou pas PHP en deuxième langue vivante ;-)

  13. #13
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Effectivement, un tableau d'input text de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <form>
    	<input id="a1_1" type="text"  name="a1[]" />
    	-> 
    	<input id="a1_2" type="text"  name="a1[]" /> 
    </form>
    ne sera pas vide. Il sera rempli de champs vides, ce qui n'est pas la même chose.

    La seule exception est si il s'agit d'un tableau de checkboxes, car les checkboxes ne sont pas envoyées si elles ne sont pas cochées. Donc un tableau de checkboxes non cochées sera vide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quelle est la bonne pratique pour accéder optimalement à un membre d'un array?
    Par billybobbonnet dans le forum Développement Windows
    Réponses: 4
    Dernier message: 01/09/2014, 14h13
  2. Réponses: 1
    Dernier message: 19/03/2013, 11h19
  3. Réponses: 5
    Dernier message: 08/04/2011, 10h55
  4. Quelle est la bonne pratique
    Par sam01 dans le forum Langage
    Réponses: 3
    Dernier message: 16/04/2010, 15h13
  5. [c# 2.0]TryParseExact Quelle est la bonne syntaxe ?
    Par Pierre8r dans le forum Windows Forms
    Réponses: 2
    Dernier message: 25/05/2006, 19h34

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