Page 1 sur 2

Comparer 2 colonnes se trouvant dans 2 lignes différentes

Posté : 17 avr. 2010, 15:53
par rimbaut
Re Bonsoir,
Je suis toujours avec mon tableau et souhaite comparer 2 lignes et 2 colonnes différentes. Voila, je voudrais comparer la précédente ligne de fin de cours avec la ligne suivante de début de cours afin de vérifier qu'il n'y a pas d'incompatibilités (chevauchement dans les horaires).

Voici le code :
$debutCours = array();
	 $debutCours[0]=mktime(14,0,0,04,12,2010);
     $debutCours[1]=mktime(16,0,0,04,13,2010);
     $debutCours[2]=mktime(14,0,0,04,14,2010);
     $debutCours[3]=mktime(15,0,0,04,14,2010);
     $debutCours[4]=mktime(14,0,0,04,15,2010);
     $debutCours[5]=mktime(16,0,0,04,15,2010);
     $debutCours[6]=mktime(8,0,0,04,16,2010);
     $debutCours[7]=mktime(9,0,0,04,16,2010);
     $debutCours[8]=mktime(14,0,0,04,16,2010);
	 
//    foreach( $debutCours as $value ) // on parcourt $array, la valeur de l'item courant est copiée dans $value
//     echo $value . '<br />'; // affichage 
   
   $finCours = array();
   $finCours[0]=mktime(16,0,0,04,12,2010);
   $finCours[1]=mktime(18,0,0,04,13,2010);
   $finCours[2]=mktime(16,0,0,04,14,2010);
   $finCours[3]=mktime(17,0,0,04,14,2010);
   $finCours[4]=mktime(16,0,0,04,15,2010);
   $finCours[5]=mktime(18,0,0,04,15,2010);
   $finCours[6]=mktime(12,0,0,04,16,2010);
   $finCours[7]=mktime(11,0,0,04,16,2010);
   $finCours[8]=mktime(16,0,0,04,16,2010);
   
   
   array_multisort($debutCours, $fincours);
   
 
//    foreach( $finCours as $value ) // on parcourt $array, la valeur de l'item courant est copiée dans $value
//      echo $value . '<br />'; // affichage 
   // Calcul de la taille du tableau $legumes
   $tailleTab = sizeof($debutCours);
   
    // comparaison du tableau
      if ($debutCours[$cle]=$finCours[$cle-1])
	  {
	     echo" <br />";
      }
	  else
	  {
	     echo"Il y a une incompatbilité! <br />";
	  }
  
J'aurai bien aimer utiliser la fonction array_diff mais celle ci compare 2 lignes distinctes.

Merci pour toute aide

Re: Comparer 2 colonnes se trouvant dans 2 lignes différentes

Posté : 18 avr. 2010, 09:52
par Aureusms
Ton idée avec foreach est bonne mais ajoute la clef dans l'appel de fonction :
foreach( $debutCours as $cle => $value ) 
//ou plus loin
 foreach( $finCours as $cle => $value )


Ensuite pour ton cas, je ferai un tableau multi_colonne et pas deux tableaux :
//$tableau_cours aura la forme = $tableau_cours[] = array (debut_cours, fin_cours);
$tableau_cours = array ();
$tableau_cours[] = array (mktime(14,0,0,04,12,2010), mktime(16,0,0,04,12,2010));
$tableau_cours[] = array (mktime(16,0,0,04,13,2010), mktime(18,0,0,04,13,2010));
...

Re: Comparer 2 colonnes se trouvant dans 2 lignes différentes

Posté : 18 avr. 2010, 11:54
par rimbaut
Bonjour à tous, merci pour ton aide Aureusms,
J'ai suivi ton exemple mais je voudrais alors utilisé un tableau associatif. Or, selon le code ci dessous, la clé de mon tableau est toujours un indice entier et n'apparaît donc pas comme clé [cours 1] etc..
<?php
$tableau_Cours=array();
$tableau_Cours['Cours 1']=array (mktime(14,0,0,04,14,2010), mktime(12,0,0,04,16,2010));
$tableau_Cours['Cours 2']=array (mktime(14,0,0,04,12,2010), mktime(16,0,0,04,12,2010));
$tableau_Cours['Cours 3']=array (mktime(16,0,0,04,13,2010), mktime(18,0,0,04,13,2010));
$tableau_Cours['Cours 4']=array (mktime(8,0,0,04,16,2010), mktime(16,0,0,04,14,2010));
$tableau_Cours['Cours 5']=array (mktime(15,0,0,04,14,2010), mktime(17,0,0,04,14,2010));
$tableau_Cours['Cours 6']=array (mktime(16,0,0,04,15,2010), mktime(16,0,0,04,15,2010));
$tableau_Cours['Cours 7']=array (mktime(9,0,0,04,16,2010), mktime(18,0,0,04,15,2010));
$tableau_Cours['Cours 8']=array (mktime(14,0,0,04,16,2010), mktime(16,0,0,04,16,2010));
$tableau_Cours['Cours 9']=array (mktime(14,0,0,04,15,2010), mktime(11,0,0,04,16,2010));


sort($tableau_Cours);

echo "<table width=80% border=1 bordercolor=blue>
  <tr><th>Date des Cours</th><th>Horaires des cours</th><th><small>
  Les chevauchements</th><tr><td>"; 

//tableau 1
   echo "<table border=1 align=center>
     <tr><th>Cours</th><th>Date</th></tr>";
	    reset($tableau_Cours);
		while (list($maCle, $maValeur) = each($tableau_Cours))
		{
		   echo "<tr><td align=center>".$maCle."</td><td>".strftime("%d/%m/%Y",$debutCours[$maCle])."</td></tr>";
        }
          
         echo "</table></td><td>";

?>
D'où vient mon erreur ?

Merci d'avance pour l'aide et bon dimanche

Re: Comparer 2 colonnes se trouvant dans 2 lignes différentes

Posté : 18 avr. 2010, 12:21
par Aureusms
Pas d'espace dans le nom de la clef...
$tableau_Cours['Cours_1']=array (mktime(14,0,0,04,14,2010), mktime(12,0,0,04,16,2010));
$tableau_Cours['Cours_2']=array (mktime(14,0,0,04,12,2010), mktime(16,0,0,04,12,2010));
$tableau_Cours['Cours_3']=array (mktime(16,0,0,04,13,2010), mktime(18,0,0,04,13,2010));
$tableau_Cours['Cours_4']=array (mktime(8,0,0,04,16,2010), mktime(16,0,0,04,14,2010));
$tableau_Cours['Cours_5']=array (mktime(15,0,0,04,14,2010), mktime(17,0,0,04,14,2010));
$tableau_Cours['Cours_6']=array (mktime(16,0,0,04,15,2010), mktime(16,0,0,04,15,2010));
$tableau_Cours['Cours_7']=array (mktime(9,0,0,04,16,2010), mktime(18,0,0,04,15,2010));
$tableau_Cours['Cours_8']=array (mktime(14,0,0,04,16,2010), mktime(16,0,0,04,16,2010));
$tableau_Cours['Cours_9']=array (mktime(14,0,0,04,15,2010), mktime(11,0,0,04,16,2010));

Re: Comparer 2 colonnes se trouvant dans 2 lignes différentes

Posté : 18 avr. 2010, 12:24
par Aureusms
De plus attention à ton écriture de cours_1 ,... De cette façon cours_10 sera apprès cours_1.
Mets plutôt cours_001, cours_002, ... cela te laisse de cette façon 999 cours.
Pour ma part, je laisserai 0,1,2,3 car toi tu sais qu'il s'agit de cours...

Re: Comparer 2 colonnes se trouvant dans 2 lignes différentes

Posté : 18 avr. 2010, 13:51
par rimbaut
Oui, je veux bien laisser 0,1,2 etc... Mais sur le tableau, je ne veux pas que le cours n°1 figure avec l'indice 0. Ce qui n'a pas de sens. Or, j'ai corrigé comme tu m'as dit, mais le numéro de cours commence toujours avec l'indice 0 et c'est ce que je veux éviter.
D'autre part, un tel tableau est bien un tableau associatif ?

Je te joins le code :
<?php

$tableau_Cours=array();
$tableau_Cours['Cours_001']=array (mktime(14,0,0,04,14,2010), mktime(12,0,0,04,16,2010));
$tableau_Cours['Cours_002']=array (mktime(14,0,0,04,12,2010), mktime(16,0,0,04,12,2010));
$tableau_Cours['Cours_003']=array (mktime(16,0,0,04,13,2010), mktime(18,0,0,04,13,2010));
$tableau_Cours['Cours_004']=array (mktime(8,0,0,04,16,2010), mktime(16,0,0,04,14,2010));
$tableau_Cours['Cours_005']=array (mktime(15,0,0,04,14,2010), mktime(17,0,0,04,14,2010));
$tableau_Cours['Cours_006']=array (mktime(16,0,0,04,15,2010), mktime(16,0,0,04,15,2010));
$tableau_Cours['Cours_007']=array (mktime(9,0,0,04,16,2010), mktime(18,0,0,04,15,2010));
$tableau_Cours['Cours_008']=array (mktime(14,0,0,04,16,2010), mktime(16,0,0,04,16,2010));
$tableau_Cours['Cours_009']=array (mktime(14,0,0,04,15,2010), mktime(11,0,0,04,16,2010));


sort($tableau_Cours);

echo "<table width=80% border=1 bordercolor=blue>
  <tr><th>Date des Cours</th><th>Horaires des cours</th><th><small>
  Les chevauchements</th><tr><td>"; 

//tableau 1
   echo "<table border=1 align=center>
     <tr><th>Cours</th><th>Date</th></tr>";
	   foreach($tableau_Cours as $maCle=>$maValeur)
        {
           echo "<tr><td align=center>".$maCle."</td><td>".strftime("%d/%m/%Y",$debutCours[$maCle])."</td></tr>";
        }
         echo "</table></td><td>";

?>
Merci pour ton aide

Re: Comparer 2 colonnes se trouvant dans 2 lignes différentes

Posté : 18 avr. 2010, 14:58
par Aureusms
Oui il est bien associatif.

Re: Comparer 2 colonnes se trouvant dans 2 lignes différentes

Posté : 18 avr. 2010, 15:50
par rimbaut
Ok mais comment puis je remédier au fait que je veux que dans la 1er colonne de mon tableau apparaisse l'indice "cours 1" et non l'indice "0".

Merci pour ton aide

Re: Comparer 2 colonnes se trouvant dans 2 lignes différentes

Posté : 18 avr. 2010, 16:12
par devlop78
Pourquoi trier ton tableau alors qu'il est déjà dans l'ordre.
En utilisant ksort() j'obtiens

Cours_001 01/01/1970
Cours_002 01/01/1970
Cours_003 01/01/1970
Cours_004 01/01/1970
Cours_005 01/01/1970

etc.

En utilisant asort() j'obtiens :

Cours_002 01/01/1970
Cours_003 01/01/1970
Cours_001 01/01/1970
Cours_005 01/01/1970
Cours_009 01/01/1970

Re: Comparer 2 colonnes se trouvant dans 2 lignes différentes

Posté : 18 avr. 2010, 16:16
par devlop78
Moi je te propose ça (essaie pour voir) :

Code : Tout sélectionner

<?php $tableau_Cours=array(); $tableau_Cours['Cours_001']=array (mktime(14,0,0,04,14,2010), mktime(12,0,0,04,16,2010)); $tableau_Cours['Cours_002']=array (mktime(14,0,0,04,12,2010), mktime(16,0,0,04,12,2010)); $tableau_Cours['Cours_003']=array (mktime(16,0,0,04,13,2010), mktime(18,0,0,04,13,2010)); $tableau_Cours['Cours_004']=array (mktime(8,0,0,04,16,2010), mktime(16,0,0,04,14,2010)); $tableau_Cours['Cours_005']=array (mktime(15,0,0,04,14,2010), mktime(17,0,0,04,14,2010)); $tableau_Cours['Cours_006']=array (mktime(16,0,0,04,15,2010), mktime(16,0,0,04,15,2010)); $tableau_Cours['Cours_007']=array (mktime(9,0,0,04,16,2010), mktime(18,0,0,04,15,2010)); $tableau_Cours['Cours_008']=array (mktime(14,0,0,04,16,2010), mktime(16,0,0,04,16,2010)); $tableau_Cours['Cours_009']=array (mktime(14,0,0,04,15,2010), mktime(11,0,0,04,16,2010)); asort($tableau_Cours); echo "<table width=80% border=1 bordercolor=blue> <tr><th>Date des Cours</th><th>Horaires des cours</th><th><small> Les chevauchements</th><tr><td>"; //tableau 1 echo "<table border=1 align=center> <tr><th>Cours</th><th>Date début</th><th>Date fin</th></tr>"; foreach($tableau_Cours as $maCle=>$maValeur) { echo "<tr><td align=center>".$maCle."</td><td>".strftime("%d/%m/%Y",$maValeur[0])."</td><td>".strftime("%d/%m/%Y",$maValeur[1])."</td></tr>"; } echo "</table></td><td>"; ?>

Re: Comparer 2 colonnes se trouvant dans 2 lignes différentes

Posté : 18 avr. 2010, 16:24
par devlop78
1ere solution :

foreach($tableau_Cours as $maCle=>$maValeur) {

$debut_cours = strftime("%d/%m/%Y",$maValeur[0]);
if ($debut_cours == $fin_cours) echo "Chauvauchement $maCle";
$fin_cours = strftime("%d/%m/%Y",$maValeur[1]);


}

Re: Comparer 2 colonnes se trouvant dans 2 lignes différentes

Posté : 18 avr. 2010, 16:27
par devlop78
Encore mieux (pour la date seulement):

foreach($tableau_Cours as $maCle=>$maValeur) {

$debut_cours = date("Ymd",$maValeur[0]);
if ($debut_cours < $fin_cours) echo "Chauvauchement $maCle";
$fin_cours = date("Ymd",$maValeur[1]);


}

Ou (pour la date et l'heure, attention tu as des erreurs dans ton tableau) :
foreach($tableau_Cours as $maCle=>$maValeur) {

$debut_cours = $maValeur[0];
if ($debut_cours < $fin_cours) echo "Chauvauchement $maCle";
$fin_cours = $maValeur[1];


}

Re: Comparer 2 colonnes se trouvant dans 2 lignes différentes

Posté : 18 avr. 2010, 17:34
par rimbaut
Merci pour ton code devlopnet. Ca fonctionne. Reste un point en suspens. Pour un même jour, je veux comparer la fin du cours précédent avec le début du cours suivant afin de vérifier qu'il n'y a pas de chevauchement. J'ai fait cela avec un tableau indicié, mais je ne vois pas comment faire avec un tableau associatif sachant que les lignes à comparer sont différentes, fin de cours étant sur la ligne -1.

Voici le code qui fait la différence entre les lignes :
<?php

$tableau_Cours=array();
$tableau_Cours['Cours_003']=array (mktime(14,0,0,04,14,2010), mktime(16,0,0,04,14,2010));
$tableau_Cours['Cours_001']=array (mktime(14,0,0,04,12,2010), mktime(16,0,0,04,12,2010));
$tableau_Cours['Cours_002']=array (mktime(16,0,0,04,13,2010), mktime(18,0,0,04,13,2010));
$tableau_Cours['Cours_004']=array (mktime(15,0,0,04,14,2010), mktime(17,0,0,04,14,2010));
$tableau_Cours['Cours_008']=array (mktime(9,0,0,04,16,2010), mktime(11,0,0,04,16,2010));
$tableau_Cours['Cours_005']=array (mktime(14,0,0,04,15,2010), mktime(16,0,0,04,15,2010));
$tableau_Cours['Cours_006']=array (mktime(16,0,0,04,15,2010), mktime(18,0,0,04,15,2010));
$tableau_Cours['Cours_007']=array (mktime(16,0,0,04,16,2010), mktime(12,0,0,04,16,2010));
$tableau_Cours['Cours_009']=array (mktime(14,0,0,04,16,2010), mktime(16,0,0,04,16,2010));

//ksort trie le tableau suivant les clés en maintenant la correspondance entre les clés et les valeurs. Cette fonction est importante pour les tableaux associatifs
ksort($tableau_Cours);


echo "<table width=80% border=1 bordercolor=blue>
  <tr><th>Date des Cours</th><th>
  Les chevauchements</th><tr><td>";

//tableau 1
   echo "<table border=1 align=center>
     <tr><th>Cours</th><th>Date des cours</th><th>Début du cours</th><th>Fin du cours</th></tr>";
           foreach($tableau_Cours as $maCle=>$maValeur)
        {
            echo "<tr><td align=center>".$maCle."</td><td>".strftime("%d/%m/%Y",$maValeur[0])."</td><td>".strftime("%H h",$maValeur[0])."</td><td>".strftime("%H h",$maValeur[1])."</td></tr>";
        }
         echo "</table></td><td>";
		 
//Tableau diff
   echo "<table border=1 bordercolor=green align=center>
    <tr><th>Cours</th>
    <th>Date</th>
	<th>Fin cours précédent </th>
	<th>Debut cours suivant</th></tr>";
 foreach($tableau_Cours as $maCle=>$maValeur)
    {
       if ($maValeur[0] < $maValeur[1])
	   {
	     
		  echo "<tr><td align=center>".$maCle."</td><td align=center>".strftime("%d/%m/%Y",$maValeur[0])."</td><td align=center>".strftime("%H h",$maValeur[1])."</td><td align=center>".strftime("%H h",$maValeur[0])."</td></tr>";
       }
   
   }
echo "</table></table>";
  

?>
Merci pour ton aide précieuse

Re: Comparer 2 colonnes se trouvant dans 2 lignes différentes

Posté : 18 avr. 2010, 17:44
par devlop78
Regarde mes deux derniers posts ils te donnaient la solution du chauvauchement.

Re: Comparer 2 colonnes se trouvant dans 2 lignes différentes

Posté : 18 avr. 2010, 18:25
par rimbaut
ok, je n'avais pas fait cas. Ca fonctionne mais 2 petites questions et je te laisse tranquille :

1°) Peux tu m'expliquer pour quoi il faut mettre l'expression $fin_Cours = $maValeur[1] à la fin de la condition. Si je la mets au dessous de $debut_Cours=$maValeur[0], ça ne marche pas.

2°) J'ai le message comme quoi ma variable fin_Cours ne serait pas définie. Voici le message :
Notice: Undefined variable: fin_Cours in C:\wamp\www\Tableaux\AgendaTabIndicie.php on line 116
La ligne 116 est la ligne du if.

et voici le code qui fonctionne d'ailleurs :
//Tableau diff
   echo "<table border=1 bordercolor=green align=center>
    <tr><th>Cours</th>
    <th>Date</th>
	<th>Fin cours précédent </th>
	<th>Debut cours suivant</th></tr>";
 foreach($tableau_Cours as $maCle=>$maValeur)
    {
	   $debut_Cours = $maValeur[0];
          if ($debut_Cours < $fin_Cours)
		  echo "<tr><td>".$maCle."</td><td>".strftime("%d/%m/%Y",$maValeur[0])."</td><td>".strftime("%H h",$maValeur[0])."</td><td>".strftime("%H h",$maValeur[1])."</td></tr>";
		  $fin_Cours = $maValeur[1];
	}
	     
echo "</table></table>";

Merci pour ta compétence