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 :

Gestion de tableaux à 2 dimensions - optimisation ? [PHP 5.3]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Par défaut Gestion de tableaux à 2 dimensions - optimisation ?
    Bonjour à tous,

    Je souhaite gérer l'affichage d'évènements par slot d'affichage (ligne) car pour une même journée, je peux avoir plusieurs évènements. J'ai donc pensé définir une matrice avec les slots en axe 1 et les jours en axe 2.

    la grande question avant d'aller plus en avant sur le code que j'ai pensé est : peut-on optimiser ces codes php (je suis persuadé que oui mais je ne sais pas trop comment faire) ?

    Merci d'avance !

    --

    N'y connaissant pas grand chose en PHP je suis parti sur ce code pour l'initialisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function InitSlots() {
       global $arrSlots ; 
     
       for ($slot=0; $slot<10; $slot++) 
       {
          for ($jour=0; $jour<7; $jour++) 
          {
             $arrSlots[$slot][$jour] = array('id' => '0', 'contenu' => ' ') ;          
          }	     	
       }
       return true ; 
    }
    Bien sur, un évènement ne doit être présent qu'une seule fois dans ces slots, donc j'ai fait une fonction pour vérifié qu'il n'est pas déjà présent en faisant une recherche sur son id :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function EvenementDejaTraite($id) {
       global $arrSlots ; 
     
       for ($slot=0; $slot<10; $slot++) 
       {
          for ($jour=0; $jour<7; $jour++) 
          {
             if ($arrSlots[$slot][$jour]['id'] == $id )
                return true ;
          }	     	
       }
       return false ; 
    }
    Une fonction pour vérifié que je les cases sont vides pour un évènement donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function Estdisponible ($slot, $jour, $duree)
    {
       global $arrSlots ; 
     
       // vérification de la dispo sur la ligne
       for ($delta=0 ; $delta < $duree ; $delta++) 
       {
          if ($arrSlots[$slot][$jour+$delta]['id'] <> '0')
             return false ;
       }
       return true ;     
    }
    et son pendant pour occuper la place
    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
     
    function Occuper ($slot, $jour, $duree, $contenu, $id)
    {
       global $arrSlots ; 
       $premier = true ; 
     
       // vérification de la dispo sur la ligne
       for ($delta=0 ; $delta < $duree ; $delta++) 
       {
          if ($premier )
          {
             $arrSlots[$slot][$jour+$delta]['contenu']= $contenu ; 
             $arrSlots[$slot][$jour+$delta]['id']= $id ; 
             $premier = false ; 
          }
          else
          {
             $arrSlots[$slot][$jour+$delta]['contenu'] = 'X' ; 
             $arrSlots[$slot][$jour+$delta]['id']= $id ; 
          }
       }
       return $dureeligne ; 
    }

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Salut Emmanuel,

    Un gros conseil, tu dois fuir les variables globales comme la peste.
    En PHP les variables sont passées par copie intelligente.
    Tant que ta fonction ne fait que les lire, elles restent sous forme de référence donc ne consomment quasiment rien.
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    <?php
     
    function InitSlots()
    {
        return array_fill(0, 10, array_fill(0, 7, array('id' => '0', 'contenu' => '')));
    }
     
    function estDisponible(array $data, $slot, $jour, $duree)
    {
        for ($i = 0; $i < $duree; ++$i, ++$jour)
        {
            if ($data[$slot][$jour]['id'] <> '0')
            {
                return false;
            }
        }
     
        return true;
    }
     
    function evenementDejaTraite(array $data, $id)
    {
        foreach ($data as $evt)
        {
            foreach ($evt as $details)
            {
                if ($details['id'] == $id)
                {
                    return true;
                }
            }
        }
     
        return false;
    }
     
    // on passe $data par référence car la fonction va modifier son contenu
    function Occuper(array &$data, $slot, $jour, $duree, $contenu, $id)
    {
        for ($i = 0; $i < $duree; ++$i, ++$jour)
        {
            $data[$slot][$jour]['id']      = $id;
            $data[$slot][$jour]['contenu'] = ($i === 0) ? $contenu : 'X';
        }
    }
     
    ?>
    J'ai essayé de faire simple.
    Par contre dans ton code, tu ne vérifies rien ; comme par exemple t'assurer que le $slot existe ou que la durée ne dépasse pas le maximum.

  3. #3
    Membre Expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Par défaut
    Un très grand merci à toi pour cette réécriture bien php

    Cà fonctionne nickel et je ne constate pas de régression.

    Pour ton conseil avisé, j'attendais d'avoir une version stable et bien écrite pour m'assurer que tout est bien vérifié (surtout la limite des slots...)


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

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/03/2006, 17h48
  2. [Tableaux] mémoriser un tableaux à n dimension
    Par Benat64 dans le forum Langage
    Réponses: 4
    Dernier message: 21/02/2006, 16h43
  3. [Tableaux] Gerer des tableaux à deux dimensions
    Par FrankOVD dans le forum Langage
    Réponses: 2
    Dernier message: 02/12/2005, 15h20
  4. Tableaux à plusieurs dimensions
    Par Diabolik dans le forum Assembleur
    Réponses: 3
    Dernier message: 08/12/2003, 12h15
  5. [langage] erreurs utilisation tableaux 2 dimensions
    Par drosof dans le forum Langage
    Réponses: 11
    Dernier message: 01/07/2003, 11h44

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