Comparaison entre plusieurs éléments d'un tableau

Eléphant du PHP | 71 Messages

27 juin 2015, 21:11

Bonjour, Bonsoir,

Je viens vers vous car j'ai actuellement un problème que je ne vois pas comment résoudre :

J'aimerais pouvoir comparer plusieurs éléments. Je m'explique, j'ai une class php appelée Evenement.php.

Voici le code de cette classe :
<?php
class Evenement
{
 // Variables 
 private $_id,
   $_lib,
   $_date_debut,
   $_heure_debut,
   $_date_fin,
   $_heure_fin;

 
 // Constructeur d'Evenement
 public function __construct(array $donnees)
  {
    $this->hydrate($donnees);
  }
  
  // Chargement auto du setter de chaque variable
  public function hydrate(array $donnees)
  {
    foreach ($donnees as $key => $value)
    {
      $method = 'set'.ucfirst($key); // ucfirst : met en majuscule la premiere lettre car les setters ont une majuscule (ex : SetId)
      
      if (method_exists($this, $method)) // si la methode existe on l'appelle
      {
        $this->$method($value);
      }
    }
  }
 #GETTERS#
 
 public function id()
 { 
  return $this->_id; 
 }
 
 public function lib()
 { 
  return $this->_lib; 
 }

 public function date_debut()
 { 
  return $this->_date_debut; 
 }

 public function date_fin()
 { 
  return $this->_date_fin; 
 }
 
 public function heure_debut()
 { 
  return $this->_heure_debut; 
 }

 public function heure_fin()
 { 
  return $this->_heure_fin; 
 }

 #SETTERS#
 
 public function SetId($id)
 { $id = (int) $id;
    if ($id >= 0)
    { $this->_id = $id; }
 }
 
 public function SetLib($lib)
 {  if (is_string($lib))
    { $this->_lib = $lib;  }
 }
 
 public function SetDate_debut($dd)
 {  $this->_date_debut = $dd; }
 
 public function SetDate_fin($df)
 {  $this->_date_fin = $df; }
 
 public function SetHeure_debut($hd)
 {  $this->_heure_debut = $hd; }
 
 public function SetHeure_fin($hf)
 {$this->_heure_fin = $hf; }
}
J'ai un autre fichier, appelé EvenementsManager.php dans lequel je gère les Evenements :
<?php
class EvenementsManager
{
  private $_db; // Instance de PDO
  private $_eventpre;
  
  public function __construct($db)
  {
    $this->setDb($db);
  }

  public function getList()
  {
    $persos = [];
    
    $q = $this->_db->prepare('SELECT id, lib, date_debut, heure_debut, date_fin, heure_fin FROM evenement');
    $q->execute();
    
    while ($donnees = $q->fetch(PDO::FETCH_ASSOC))
    {
      $persos[] = new Evenement($donnees);
    }
    
 foreach ($persos as $event)
 {
  if(is_null($this->getEventPre()))
  {
  echo $event->date_debut();echo '<br> -----------------------<br> - ';
  echo $event->heure_debut(); echo '-';echo $event->heure_fin();echo ': ';echo $event->lib();echo '<br>';
  
  $eventpre==$event;
  }
  
 }
   // return $persos;
  }
  
  public function setDb(PDO $db)
  {
    $this->_db = $db;
  }
  
  public function getEventPre()
  {
   return $this->_eventpre;
  }
  public function setEventpre($ev)
  {
    $this-> $_eventpre;
  }
}
Ce que j'aimerais faire se trouve donc dans la fonction "getList" de l'EvenementsManager. J'aimerais que l'on puisse, une fois la liste d'Evenements enregistré dans le tableau $persos, afficher chacuns d'entre eux mais de sorte a avoir un planning.
Cela ressemblerais donc a ca :

Samedi 27 Juin 2015
---------------------------------
- 08h00-09h00 : Evenement 1
- 14h00-16h00 : Evenement 2

Dimanche 28 Juin 2015
----------------------------------
- 09h00-10h00 : Evenement 3


Le problème est que pour chaque evenement, il m'affiche tout : la date, les traits, l'heure et le titre OR j'aimerais que quand un évenement à la meme date que le précédent, qu'il rajoute seulement l'heure et le titre de l'evenement.

Le problème est que je ne vois pas comment faire en sorte que, dans mon foreach, je puisse comparer un élément de l'evenement actuel avec un élément de l'evenement précédent.

Merci d'avance à tout ceux qui m'aiderons ^^

Mammouth du PHP | 688 Messages

27 juin 2015, 21:52

une remarque, si tu veux afficher cette liste 2 fois, tu fais 2 fois la requete sql, alors qu'une fois suffit.

pour ta question, tu tries, dans ta requete sql par date.
dans la boucle, tu testes si la date est la même que la date précédente, et quand c'est nécessaire, tu affiches la ligne de la date, dans tous les cas, la ligne de l'événement.