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 :

Iterator et fonctions [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Débutant Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Points : 170
    Points
    170
    Par défaut Iterator et fonctions
    Je suis entrain de tester ce qu"il est possible de faire avec les objects du style ITERATOR.
    Ce n'est pas mal mais ce serait bcp mieux si on pouvait (et à mon avis on peut...) passer une "user function" comme paramètre.

    Voici mon test:

    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
    <?php
    class myIterator implements Iterator
    {	private $start, $end ;
    
    	public function __construct( $start, $end )
    	{	$this->curr = $this->start = $start ;
    		$this->end  = $end ;
    	}
    /**
    * Iterator methods
    *
    */	
    	function rewind() {
    		$this->curr = $this->start ;
    	}
    	
    	function key() {
    		return($this->curr) ;
    	}
    	
    	function current() {
    		return(pow($this->curr,2)) ;
    	}
    	
    	function next() {
    		if ($this->valid())
    			$this->curr++ ;
    	}
    	
    	function valid() {
    		return( ($this->curr <= $this->end) ? true : false ) ; 
    	}
    		
    /**
    * End of Iterator methods
    *
    */
    }
    
    $array = new myIterator( 10, 15 );
    
    while($array->valid() )
    {	print("the power of " . $array->key() . " is " . $array->current() . "<br>\n") ;
    	$array->next() ;
    }
    ?>
    Que manque t'il pour qu'on puisse faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function myFunction()
    {    N"importe quoi   }
    
    $array = new myIterator( 10, 15 , myFunction);
    il faut au moins passer la fonction comme paramètre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public function __construct( $start, $end, myFunction() )
    
    Afin que la méthode currrent devienne:
    
    
    	function current() {
    		return(myFunction())) ;
    	}
    Je cherche - mal sans doute - et donc, je vous demande un p'tit coup de pouce

  2. #2
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 273
    Points
    273
    Par défaut
    Bonjour,

    Il ne te manque pas grand chose.

    En reprenant ton exemple....

    Code php : 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
    48
    49
     
     
    <?php
    class myIterator implements Iterator
    {	private $start, $end, $callback ;
     
    	public function __construct( $start, $end, $callback )
    	{	$this->curr = $this->start = $start ;
    		$this->end  = $end ;
    		$this->callback = $callback;
    	}
    /**
    * Iterator methods
    *
    */	
    	function rewind() {
    		$this->curr = $this->start ;
    	}
     
    	function key() {
    		return($this->curr) ;
    	}
     
    	function current() {
    		return(call_user_func_array($this->callback, array($this->curr) ) ;
    	}
     
    	function next() {
    		if ($this->valid())
    			$this->curr++ ;
    	}
     
    	function valid() {
    		return( ($this->curr <= $this->end) ? true : false ) ; 
    	}
     
    /**
    * End of Iterator methods
    *
    */
    }
     
    $array = new myIterator( 10, 15 );
     
    while($array->valid() )
    {	print("the power of " . $array->key() . " is " . $array->current() . "<br>\n") ;
    	$array->next() ;
    }
    ?>

    et voilà... Tout tient dans la fonction call_user_func_array (tu peux aussi utiliser la version call_user_func)

    la doc de call_user_func_array
    et celle de call_user_func


    Cordialement,
    Patouche

  3. #3
    Débutant Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Points : 170
    Points
    170
    Par défaut Iterator & user functions
    Trouvé:

    Voici une solution (il y en a peut être d'autres)

    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
    48
    49
    	
    class myIterator implements Iterator
    {	private $start, $end, $function ;
    
    	public function __construct( $start, $end , $function )
    	{	$this->curr     = $this->start = $start ;
    		$this->end      = $end ;
    		$this->function = $function ;
    	}
    /**
    * Iterator methods
    *
    */	
    	function rewind() {
    		$this->curr = $this->start ;
    	}
    	
    	function key() {
    		return($this->curr) ;
    	}
    	
            function current() {
    		return( call_user_func( $this->function, $this->key() ) ) ;
    	}
    	
    	function next() {
    		if ($this->valid())
    			$this->curr++ ;
    	}
    	
    	function valid() {
    		return( ($this->curr <= $this->end) ? true : false ) ; 
    	}
    		
    /**
    * End of Iterator methods
    *
    */
    }
    
    function myFunction($param)
    { 	return(pow($param,2)) ; }
    
    $array = new myIterator( 10, 15 , "myFunction" );
    
    while($array->valid() )
    {	print("the power of " . $array->key() . " is " . $array->current() . "<br>\n") ;
    	$array->next() ;
    }
    Voilà, merci de me tenir informé si + simple ou + performant

  4. #4
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 273
    Points
    273
    Par défaut
    Non, c'est exactement ça... et ça ressemble à ce qu'il y a plus haut... bon, j'avais pas réécrit la boucle while... flemme....

    le choix entre call_user_func_array et call_user_func est tien. Après, ce sera une question d'habitude.


    Cordialement,
    Patouche

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

Discussions similaires

  1. passer un iterator en argument d'une fonction
    Par manitor dans le forum SL & STL
    Réponses: 3
    Dernier message: 13/09/2009, 15h42
  2. Iteration d'une fonction monadique
    Par kg2007 dans le forum Haskell
    Réponses: 17
    Dernier message: 13/05/2009, 19h00
  3. fonction template et iterator
    Par befalimpertinent dans le forum Langage
    Réponses: 9
    Dernier message: 12/05/2009, 13h41
  4. Iterator sur list et fonction const
    Par Pierre.M dans le forum SL & STL
    Réponses: 2
    Dernier message: 16/04/2008, 21h50
  5. Fonction taille et hauteur arbre binaire de façon itérative
    Par kalthoum dans le forum Autres langages
    Réponses: 1
    Dernier message: 04/12/2006, 20h55

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