Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1538 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [RESOLU] Plages horaires successives

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] Plages horaires successives

n°2232109
poubs
Mais heu, c'est pas moi !
Posté le 29-06-2014 à 09:29:06  profilanswer
 

Bonjour,
J'ai besoin de conseils !
 
J'ai ce tableau :

Code :
  1. array(6) {
  2.   ["06-08"]=>
  3.   string(1) "7"
  4.   ["08-10"]=>
  5.   string(1) "7"
  6.   ["10-12"]=>
  7.   string(1) "7"
  8.   ["18-20"]=>
  9.   string(1) "7"
  10.   ["20-22"]=>
  11.   string(1) "7"
  12.   ["22-24"]=>
  13.   string(1) "7"
  14. }


 
Ce sont les clés qui m'intéressent, pas les valeurs. Ces clés sont des plages horaires.
Je voudrais pouvoir obtenir 2 grandes plages horaires après traitement de ce tableau.
 
En l'occurance, dans ce cas là, je voudrais obtenir :
06-08 à 10-12 et 18-20 à 22-24
ou quelque chose de ressemblant.
 
Comment vous y prendriez-vous ?
Merci de votre aide.


Message édité par poubs le 30-06-2014 à 10:16:54
mood
Publicité
Posté le 29-06-2014 à 09:29:06  profilanswer
 

n°2232137
yellu
Posté le 30-06-2014 à 09:49:34  profilanswer
 

Salut,
 
Je passerai par un tri, puis une serialisation, puis un pack des plages consurrentes, voici mon code :
 

Code :
  1. <?php
  2. $plages = array(
  3. "06-08" => "7",
  4. "08-10" => "7",
  5. "10-12" => "7",
  6. "18-20" => "7",
  7. "20-22" => "7",
  8. "22-24" => "7",
  9. );
  10. function fusion_plages($plages) {
  11. # On tri au cas ou
  12. ksort($plages);
  13. # On serialize
  14. $plages = implode(';', array_keys($plages));
  15. do {
  16.  $try = false;
  17.  # On chope les plages qui se suivent
  18.  preg_match_all('#(\-[0-9]{2};[0-9]{2}\-)#', $plages, $match);
  19.  foreach($match[1] as $match) {
  20.   # On verifie les plages qui se suivent bout a bout
  21.   if(substr($match, 1, 2) == substr($match, 4, 2)) {
  22.    # On collapse les plages
  23.    $plages = str_replace($match, '-', $plages);
  24.    $try = true;
  25.   }
  26.  }
  27. } while($try === true);
  28. # On desarialize
  29. return explode(';', $plages);
  30. }
  31. $fusion_plages = fusion_plages($plages);
  32. var_dump($fusion_plages);


 
A+

n°2232138
poubs
Mais heu, c'est pas moi !
Posté le 30-06-2014 à 09:57:48  profilanswer
 

yellu, déjà merci de m'avoir répondu.
Je galère depuis 3 jours. J'ai essayé pleins de solutions et desfois j'y suis presque et il y a tjs un petit "hic".
 
A priori il y a aussi un petit hic dans ton code, puisque dans le cas ci-dessous cela ne fonctionne pas.

Code :
  1. array(8) {
  2.   ["06-08"]=>
  3.   string(1) "1"
  4.   ["08-10"]=>
  5.   string(1) "1"
  6.   ["12-14"]=>
  7.   string(1) "1"
  8.   ["14-16"]=>
  9.   string(1) "1"
  10.   ["16-18"]=>
  11.   string(1) "1"
  12.   ["18-20"]=>
  13.   string(1) "1"
  14.   ["20-22"]=>
  15.   string(1) "1"
  16.   ["22-24"]=>
  17.   string(1) "1"
  18. }


 
Voici ce que cela me donne :

Code :
  1. array(3) {
  2.   [0]=>
  3.   string(5) "06-10"
  4.   [1]=>
  5.   string(5) "12-16"
  6.   [2]=>
  7.   string(5) "16-24"
  8. }


3 plages horaires au lieu de 2.
 
Je n'ai pas encore trop analysé ton code, je vais aller regarder ça.
Si tu as une idée, ne te gène pas.
 
Merci encore !

n°2232141
yellu
Posté le 30-06-2014 à 10:09:19  profilanswer
 

Code :
  1. function fusion_plages($plages) {
  2. # On tri au cas ou
  3. ksort($plages);
  4. # On serialize
  5. $plages = implode(';', array_keys($plages));
  6. do {
  7.  $try = false;
  8.  # On chope les plages qui se suivent
  9.  preg_match_all('#(\-[0-9]{2};[0-9]{2})#U', $plages, $match);
  10.  foreach($match[1] as $match) {
  11.   # On verifie les plages qui se suivent bout a bout
  12.   if(substr($match, 1, 2) == substr($match, 4, 2)) {
  13.    # On collapse les plages
  14.    $plages = str_replace($match, '', $plages);
  15.    $try = true;
  16.   }
  17.  }
  18. } while($try === true);
  19. # On desarialize
  20. return explode(';', $plages);
  21. }


 
La regexp prenait les deux tirets ce qui pouvait poser des problèmes et mettre fin à la boucle prématuremment.

n°2232142
poubs
Mais heu, c'est pas moi !
Posté le 30-06-2014 à 10:16:36  profilanswer
 

Mieux, beaucoup beaucoup mieux !
Merci du temps que tu m'as consacré. Je vais analyser ça en détail et notamment ce "U" à la fin de cette regexp

n°2232143
yellu
Posté le 30-06-2014 à 10:19:06  profilanswer
 

Le U ne sert à rien ici

n°2232145
yellu
Posté le 30-06-2014 à 10:25:46  profilanswer
 

En fait on peut être encor eplus court avec les références arrières je pense, à tester :
 

Code :
  1. function fusion_plages($plages) {
  2. # On tri au cas ou
  3. ksort($plages);
  4. # On serialize
  5. $plages = implode(';', array_keys($plages));
  6. # On vire les plages qui se suivent
  7. $plages = preg_replace('#\-([0-9]{2});\1#', '', $plages);
  8. # On desarialize
  9. return explode(';', $plages);
  10. }

n°2232174
poubs
Mais heu, c'est pas moi !
Posté le 30-06-2014 à 12:55:57  profilanswer
 

Hé bien ça fonctionne également super bien. La solution que j'avais imaginé ressemblait à la tienne (la 1ère) mais ne fonctionnait pas très bien.
Par contre ta 2ème solution je n'y avais pas pensé... Elle est classe, claire, concise, géniale :)  
 
Bravo et merci !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [RESOLU] Plages horaires successives

 

Sujets relatifs
Crénaux horairesProblème de connexions successives à MYSQL
besoin de code java pour horaires[VBA] comparaison entre 2 lignes successives
Excel : boucle copie de plages sous conditionBug excel suite a lancement de macros successives
Gestion de dates et d'horaires[Excel VBA] Lister les noms de plages de cellules et leurs coordonnées
imprimer 2 plages de cellules non-continues sur une même feuille[Oracle] tranches horaires
Plus de sujets relatifs à : [RESOLU] Plages horaires successives


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR