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 :

[Tableaux] iterator et class


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut [Tableaux] iterator et class
    salut
    je reviens avec ma class d'acces aux données histoire de la finaliser
    j'ai un petit probleme avec iterator, je ne lit que le premier resultat
    code
    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
    interface interface_DAO
    {
    	public function GetArrayAssoc();
    	public function GetArray();
    }
     
    class DAO extends Sql implements IteratorAggregate,Interface_DAO
    {
    	protected $db;
    	protected $resultat=array();
     
    	public function __construct($db)
    	{
    		$this->db=$db;//permet d'appeler les methodes de traitement des données
    		$this->db->connect();
    	}
     
    	public function getIterator()
    	{
    		$iterator= new Iterator($this->resultat);
    		return $iterator;
    	}
     
    	public function GetArrayAssoc()
    	{
    		$this->resultat=$this->db->GetArrayAssoc();
    		return $this->resultat;
    	}
    et l'utilisation
    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
    try{
    	if($dao->Select($param))
    	{
    		//while($val=$dao->GetArrayAssoc())
    		//{print_r($val);}
    		foreach ($dao->GetArrayAssoc() as $val)
    		{
    			print_r($val);
    		}
    	}
    }
    catch (Exception $e)
    {
    	echo $e->getMessage();
    }
    mm en fait il n'arrive a passer a la ligne suivante

    merci

  2. #2
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    c est une interface dont il te faut implémenter toutes les méthodes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://www.php.net/~helly/php/ext/spl/interfaceIterator.html
    faut faire une classe MyIterator par exemple et rajouter tout ca dedans et expliquer comment ca se passe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public function getIterator()
       {
          $iterator= new MyIterator($this->resultat);
          return $iterator;
       }

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    la voici elle est externalisée
    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
    <?php
    class UserIterator implements Iterator
    {
    	private $array=array();
    	private $key;
    	private $current;
     
    	public function __construct($array)
    	{
    		$this->array=$array;
    	}
     
    	public function rewind()
    	{
    		reset($this->array);
    		$this->next();
    	}
     
    	public function valid()
    	{
    		return $this->key!==NULL;
    	}
     
    	public function key()
    	{
    		return  $this->key;
    	}
     
    	public function current()
    	{
    		return $this->current;	
    	}
     
    	public function next()
    	{
    		list($key,$current)=each($this->array);
    		$this->key=$key;
    		$this->current=$current;
    	}
    }
    ?>
    comment recursiveiterator??(ou un truc comme ca)

  4. #4
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    ben la d apres ce que tu fais, tu devrais mettre :
    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
    try{
       if($dao->Select($param))
       {
          $dao->GetArrayAssoc();
          //{print_r($val);}
          foreach ($dao as $val)
          {
             print_r($val);
          }
       }
    }
    catch (Exception $e)
    {
       echo $e->getMessage();
    }
    du coup ton return sert pas a grand chose

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    le return sert juste pour tester le while

    apres teste c'est toujours pareil

  6. #6
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    ok, enfin comme ca ca devrais marcher.

    Il faut faire le foreach sur la class qui a le getIterator par contre vu qu il faut lui passer le resultat, il faut appeler getArrayAssoc avant pour qu il existe

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    c'est ce que j'ai fais mais il me retourne que le premier resultat

    quand je fais un while voici la structure qu'il me retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Array
    (
        [nom] => Accessoires / C�blage
    )
    Array
    (
        [nom] => appareillage b�timent
    )
    or pour utiliser un iterator je me serai plus attendu une structure comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Array
    (
     
    [0]=>[nom] => Accessoires / C�blage
     
     [1]=>   [nom] => appareillage b�timent
    )

  8. #8
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    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
     
    try{ 
       if($dao->Select($param)) 
       { 
          $dao->GetArrayAssoc(); 
          //{print_r($val);} 
          foreach ($dao as $val) 
          { 
             print_r($val); 
          } 
       } 
    } 
    catch (Exception $e) 
    { 
       echo $e->getMessage(); 
    }
    Se ne serait pas plus simple et plus logique de récupérer un resultsSet à la sortie de GetArrayAssoc ?
    Parce que la en faits tu boucles sur celui qui fait et qui contient, sa mélange un peu tout non ?

    Pour la question sur l'interface iterator, t'attends tu à avoir un tableau de ce type ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $a = array();
    $a[0] = array();
    $a[0]["nom"] = "toto";
    $a[1] = array();
    $a[1]["nom"] = "toto";
    Auquel cas, selon ce que tu fais actuellement c'est juste pas possible (enfin si, mais on est pas maso non plus).
    Il faudrait pour cela parcourir tout les resultats d'un mysql_fetch_array, les mettre dans un tableau, puis mettre à disposition ce tableau d'une manière ou d'une autre.

    Ce qu'actuellement tu ne fais pas, et j'ai envie de dire que ce n'est pas plus mal car ainsi tu évites à ton appli de faire double travail.
    Et puis il faudrait utiliser ArrayAccess plutot non ?

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    oui en effet je pensai recuperer les resultats sous la forme que tu a indiqué
    mais ce n'est pas le cas
    en effet, je pourrai utiliser arrayAccess avec un tableau de cette forme
    mais ce n'est pas le cas

    bref iterator n'est pas non plus indispensable

    mais il y a un truc qui me derange vraiment beaucoup dans ma classe c'est l'impossibilité de faire plusieur requete comme ceci
    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
    $param['table']=array('menu');
    $param['champs']=array('nom');
    $tab['table']=array('menu');
    $tab['champs']=array('id_page');
    try{
    	if($dao->Select($param))
    	{
    		//echo var_dump($dao);
    		while($val=$dao->GetArrayAssoc())
    		{
    			$dao->Select($tab);
    			while($val1=$dao->GetArrayAssoc()){
    				print_r($val1);	
    			}
    			print_r($val);
    		}
     
    	}
    }
    la premiere boucle est interrompu par la deuxieme
    je sais pas comment faire j'ai mis le resultat de mysql_query dans un tableau, mais je ne sais pas comment le geré

  10. #10
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    oui en effet je pensai recuperer les resultats sous la forme que tu a indiqué
    mais ce n'est pas le cas
    en effet, je pourrai utiliser arrayAccess avec un tableau de cette forme
    mais ce n'est pas le cas
    C'était juste des questions, désolé :/

    Sinon on peut imaginer rajouter un paramétre à GetArrayAssoc() et à select.

    Quelque chose comme cela.

    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
     
    $param['table']=array('menu'); 
    $param['champs']=array('nom'); 
    $tab['table']=array('menu'); 
    $tab['champs']=array('id_page'); 
    try{ 
       if($dao->Select($param , "menu_nom")) 
       { 
          //echo var_dump($dao); 
          while($val=$dao->GetArrayAssoc("menu_nom")) 
          { 
             $dao->Select($tab,"menu_id"); 
             while($val1=$dao->GetArrayAssoc("menu_id")){ 
                print_r($val1);    
             } 
             print_r($val); 
          } 
     
       } 
    }
    avec à l'intérieur de la classe dao, un tableau associatif.

    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
     
    classe dao
    {
     
    private $TabQuerys;
     
    public function Select ( $param , $queryName )
    {
    $this->TabQuerys[$queryName] = monquery pour cette requete.
    }
     
    public function GetArrayAssoc( $queryName) 
    {
    return $this->TabQuerys[$queryName];
    }
    }
    Sinon je ne voies pas trop comment identifier quels resultats à renvoyer.

    Autrement, (j'insiste :o), l'idée de recevoir un resultsSet me parait plus adaptée pour ces cas la.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    je comprend pas bien ton resultstest,
    c'est juste reecrir le tableau retourner par mysql_fetch_assoc ou autre
    non?
    et le retourner ensuite?

  12. #12
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    C'est juste une classe qui vas encapsuler tout ce que 'on peut faire à partir du résultat d'un mysql_query, ou ms_sqlquery ect.

    Il n'y aurais que quelques de ligne de code à l'intérieur, mais elle te permettait sans souci de boucler sur autant de query simultané voulu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php
    class dao{
    public function Select( $args ); // Nous renverras une instance de ResultSet
    }
     
    class ResultsSet
    {
    public function __construct($query); // $query = retour de mysql_query();
    public function GetArrayAssoc(); // Nous renvoie un resultat de mysql_fetch_array
    public function Count(); // equivalent de mysql_num_rows, par exemple
    }
    ?>
    Ce n'est pas plus que cela.
    Mais d'une part cela me parait plus simple à comprendre pour quelqu'un qui repasse derrière, secondo on voit bien qu'ici la gestion de multiple query ne se pose même plus.

    PS : j'ai vu sur un autre post que l'on pouvait avoir le code PHP coloré, comment on fait ?

  13. #13
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    en faisant comme ca, ca sera plus simple, c est ce dont je t avais parlé au debut

    et la c est ton resultset qui implemente iteratoraggrgate et tu te fais un resultsetiterator

  14. #14
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    J'en profite, siddh ne connaitrais tu par hasard un site qui reprend, avec des exemples et explications, les classes et interfaces de la SPL ??
    ... Parce que des fois comment je voies pas à quoi elles servent leur classes...

  15. #15
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    euh non mais en fait j ai pas cherché

    Je farfouille dedans, j'avais l habitude avec la doc java

  16. #16
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    en bas de la page principale de la doc tu as des liens :
    http://www.php.net/~helly/php/ext/spl/main.html

  17. #17
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    d'ailleurs dans celui la :
    http://www.phpriot.com/d/articles/ph...h-spl-php-5-1/

    y a un tuto pour faire en gros ce que veux faire jeff_!

  18. #18
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    J'avais pa vu ces liens.

    en tout cas ils sont nickel ! merci bien.

    Et oui ce lien http://www.phpriot.com/d/articles/php/oop/oop-with-spl-php-5-1/ Nous renvoie complètement à ce que fait jeff !, avec ceci de plus qu'il commence à intégrer la gestion de multiple type de BDD..
    Même si l'utilisation de switch dans toutes les méthodes et d'une variables globale ne me plait pas trop.. mais ca c'est un autre débat.

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    simpa comme lien (les Nested Tree sont mieux expliquer je trouve que le tuto qui est dispo ici)

    avec ceci de plus qu'il commence à intégrer la gestion de multiple type de BDD..
    je ne sais pas si je l'ai dis mais normalement le methode que j'utilise devrais gere aussi differente base (initialement c'etait le but)
    j'ai fait le menage dans mes classes
    j'ai une classe mysql qui implemente les propriétes prope a mysql
    cette classe implemente aussi une interface (par ex: execute, GetArrayAssoc...)
    et une classe Sql a laquelle je passe un objet(par exemple un objet mysql)
    je pensai que c'etait cette class qui devait servir de recordset et non et une troisieme class deleguée

    ps: si y a moyen d'avoir la coloration syntaxique ca serait vachement utile

  20. #20
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    En tout cas je serai très intérssé de voir la suite de ce que tu est entrain de réaliser

Discussions similaires

  1. rendre iterable une Classe contenant un tableau 2D
    Par Linschn dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 13/05/2009, 21h42
  2. Réponses: 3
    Dernier message: 12/06/2008, 16h05
  3. Tableaux d'une Classe
    Par demcoul dans le forum Langage
    Réponses: 2
    Dernier message: 29/11/2007, 20h01
  4. [Tableaux] problème en classe
    Par jamjam19 dans le forum Langage
    Réponses: 2
    Dernier message: 19/04/2007, 21h20
  5. [Tableaux] Utilisations de classes
    Par hudony dans le forum Langage
    Réponses: 8
    Dernier message: 31/12/2006, 18h12

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