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 :

false || true renvoit false [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut false || true renvoit false
    Bonjour,

    Dans une boucle for, j'ai une condition if qui se base sur deux arguments liés par un "ou" :

    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
     
                $limit =  $periods->count() - 1;
                $txt = $limit;
     
                for ($i = 1; $i <= $limit; $i++) {
     
                    for ($j = 0; $j <= $limit; $j++) {
     
                        if ($i !== $j) {
     
                            if (! ($periods[$i]->getStart() > $periods[$j]->getEnd() && $periods[$i]->getEnd() > $periods[$j]->getEnd()) || 
                                ($periods[$i]->getStart() < $periods[$j]->getStart() && $periods[$i]->getEnd() < $periods[$j]->getStart()) )
                            {
                                    $overlap = true;
                            }
                            else {
                                $overlap = false;
                            }
     
                            $txt = $txt . " i = " . $i . " et j = " . $j . " et overlap = " . $overlap . "//\n";
                        }
                    }
                }
     
                echo $txt;
    Tout se passe correctement, sauf lorsque $i == 1 et $j == 2. Cela correspond aux date suivantes :

    $i : start = "2019-01-23" et end = "2019-01-25"
    $j : start = "2019-01-26" et end = "2019-02-03"

    Donc, selon moi, dans mon if, la première condition retourne false et la seconde true. Comme elle sont séparées par un "ou", ça devrait retourner true, donc $overlap devrait être affecté avec false. Or, voici ce que j'obtiens dans l'echo que je fais :

    2 i = 1 et j = 0 et overlap = // i = 1 et j = 2 et overlap = 1// i = 2 et j = 0 et overlap = // i = 2 et j = 1 et overlap = //
    EDIT :

    Pour plus de clarté, voici de manière plus lisible, les données de ma boucle :

    i = 1 et j = 0,
    start1 = 2019-01-23 00:00:00,
    end1 = 2019-01-25 00:00:00,

    start0 = 2019-01-20 00:00:00,
    end0 = 2019-01-22 00:00:00

    overlap =


    i = 1 et j = 2
    start1 = 2019-01-23 00:00:00
    end1 = 2019-01-25 00:00:00

    start2 = 2019-01-26 00:00:00
    end2 = 2019-02-03 00:00:00

    overlap = 1


    i = 2 et j = 0
    start2 = 2019-01-26 00:00:00
    end2 = 2019-02-03 00:00:00

    start0 = 2019-01-20 00:00:00
    end0 = 2019-01-22 00:00:00

    overlap =


    i = 2 et j = 1
    start2 = 2019-01-26 00:00:00
    end2 = 2019-02-03 00:00:00

    start1 = 2019-01-23 00:00:00
    end1 = 2019-01-25 00:00:00

    overlap =
    Je n'y comprends rien. Quelqu'un aurait une idée?

    Merci d'avance pour votre aide!

  2. #2
    Membre habitué Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Points : 169
    Points
    169
    Par défaut
    Bonjour. Il est difficile de s'impliquer sans voir le code des classes utilisées, mais la négation impliquerait un && et non pas || à mon sens. Sauf que le reste de la logique me semble aussi inexacte, exemple basé sur la logique expliquée à https://www.soliantconsulting.com/bl...ranges-overlap qui peut s'adapter assez bien en PHP.

    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
    <?php
     
    $periods = [
    	['start'=>new DateTime('2019-01-20 00:00:00'), 'end'=>new DateTime('2019-01-22 00:00:00')],
    	['start'=>new DateTime('2019-01-23 00:00:00'), 'end'=>new DateTime('2019-01-25 00:00:00')],
    	['start'=>new DateTime('2019-01-26 00:00:00'), 'end'=>new DateTime('2019-02-03 00:00:00')],
    	['start'=>new DateTime('2019-01-01 00:00:00'), 'end'=>new DateTime('2019-02-28 00:00:00')], // pour test de longueur
    	['start'=>new DateTime('2019-01-21 08:00:00'), 'end'=>new DateTime('2019-01-23 20:00:00')], // pour test de longueur
    ];
     
    $limit = count($periods);
    for($i = 0; $i < $limit - 1; $i++) {
    	for($j = $i + 1; $j < $limit; $j++) {
    		$diff = min (
                 		$periods[$i]['end']->getTimestamp() - $periods[$i]['start']->getTimestamp(),
                 		$periods[$i]['end']->getTimestamp() - $periods[$j]['start']->getTimestamp(),
                 		$periods[$j]['end']->getTimestamp() - $periods[$j]['start']->getTimestamp(),
                 		$periods[$j]['end']->getTimestamp() - $periods[$i]['start']->getTimestamp()
            	);
            	$overlap = $diff > 0 ? ($diff / 86400) + 1 : 0;
           	 	echo "i: $i et j: $j<br>overlap: $overlap day(s)<br><br>";
    		echo "start$i: {$periods[$i]['start']->format('Y-m-d H:i:s')}<br>end$i: {$periods[$i]['end']->format('Y-m-d H:i:s')}<br><br>";
    		echo "start$j: {$periods[$j]['start']->format('Y-m-d H:i:s')}<br>end$j: {$periods[$j]['end']->format('Y-m-d H:i:s')}<hr>";
    	}
    }

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    Merci pour ton aide.

    J'ai simplifié encore mes conditions, de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
                for ($i = 1; $i <= $limit; $i++) {
     
                    for ($j = 0; $j <= $limit; $j++) {
     
                        if ($i !== $j) {
     
                            if (! ($periods[$i]->getEnd() < $periods[$j]->getStart() || $periods[$i]->getStart() > $periods[$j]->getEnd()))
                            {
                                    $overlap = true;
                            }
                        }
                    }
                }
    Et maintenant, tout fonctionne.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/01/2010, 21h28
  2. False, True =0,1 #problème
    Par Zorro dans le forum Général Python
    Réponses: 4
    Dernier message: 17/03/2007, 12h41
  3. Débutant .. Champ True à rendre False
    Par trinity4you dans le forum Access
    Réponses: 17
    Dernier message: 27/10/2006, 17h03
  4. Réponses: 1
    Dernier message: 03/03/2006, 12h07
  5. probleme affichage visible = true ou false
    Par Hitmaaan dans le forum Access
    Réponses: 4
    Dernier message: 29/09/2005, 13h17

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