Poster une réponse 
 
Note de cette discussion :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[Résolu] For contre Foreach
Auteur Message
oxman Hors ligne
Membre

Messages : 746
Inscription : May 2008
Réputation : 10
Message : #31
RE: For contre Foreach
Oui enfin ça n'est pas exactement ça, en for tu travailles directement sur le tableau uniquement parce que dernier – vu qu'il n'est pas conçu exprès pour les tableaux – ne te donne pas la valeur d'une case du tableau, mais juste l'index du tableau que tu dois interroger.

Foreach te copie la valeur du tableau puisque lui te donne exactement ce que tu veux il ne se contente pas de te dire ou le chercher. Et si on fait un bench encore plus précis pour passer par référence on est encore plus rapide que sans et on creuse – de façon très légère – l'écart avec le For,
08-16-2008 04:23 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Asther Hors ligne
Membre

Messages : 55
Inscription : Aug 2008
Réputation : 0
Message : #32
RE: For contre Foreach
Je vais dire (puisque je suis en pleins dedans) que foreach a un avantage indéniable c'est l'utilisation d'iterateurs via la SPL sous php5 qui permet de pointer un objet et de parcourir uniquement les resultats qui nous interesse... a méditer (surtout pour un jeu)34 .
08-16-2008 08:44 PM
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Sephi-Chan Hors ligne
Administrateur
*******

Messages : 4,492
Inscription : Aug 2006
Message : #33
RE: For contre Foreach
Moi, ce que j'aime le plus dans foreach, c'est sa lisibilité. Sa déclaration est peu bruyante, elle ne contient peu de caractères tels que ;i+()<=>16.


Sephi-Chan

www.sephi-chan.fr
08-16-2008 09:10 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Asther Hors ligne
Membre

Messages : 55
Inscription : Aug 2008
Réputation : 0
Message : #34
RE: For contre Foreach
(reponse a oxman qui a suppr son post)

En fait si tu as un array et que tu souhaite recuperer un element de cet array la procedure (classique) veut que tu lise toutes le jeu de resultat pour en selectionner 1,2,3 et c'est là que l'iterateur devient important car il va te permettre de selectionner uniquement le resultat qui t'interesse sans avoir a parcourir tout le jeu de resultat.
Il y a encore beaucoups d'application notament dans la recherche de bases de données ou il peut ressembler a un LIMIT mais avec d'autres avantages, mais comme j'ai dit je suis en pleins dedans et je ne maitrise ni comprend grand choses encore pour l'instant car la doc' est vraiment pauvre et comme je ne parle pas trés bien anglais ca m'es plus difficile, mais il y a de la puissance dans ce machin et je regrette de ne pas etre assé pro pour en cérner tout le decoulement. mais j'y travail 34
(Ce message a été modifié le : 08-16-2008 09:18 PM par Asther.)
08-16-2008 09:16 PM
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
oxman Hors ligne
Membre

Messages : 746
Inscription : May 2008
Réputation : 10
Message : #35
RE: [Résolu] For contre Foreach
Oui justement, après avoir lu la doc, ça semble partiellement faux ce que tu dis.

Tu peux choisir comment tu itères sur l'objet, mais pas d'atterrir directement sur les éléments qui t'intéressent.
Du moins, si tu peux, il faut que dans ta classe, lui faire itérer jusqu'à l'objet demandé et donner comme prochaine itération celui-ci. Donc toi oui tu itères par filtre et n'obtiens que ce que tu veux, mais ta classe elle doit tout de même tout itérer.
08-16-2008 10:53 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Sephi-Chan Hors ligne
Administrateur
*******

Messages : 4,492
Inscription : Aug 2006
Message : #36
RE: [Résolu] For contre Foreach
Ce qui semble assez logique, en fait. Pour te renvoyer ce que tu veux, il faut bien que l'itérateur ejecte ce dont tu ne veux pas. Pour ça, il doit itérer. Ça permet juste de ne pas avoir à faire des continue soi-même à grand coup de conditions. C'est déjà pas mal. 2


Sephi-Chan

www.sephi-chan.fr
(Ce message a été modifié le : 08-16-2008 10:59 PM par Sephi-Chan.)
08-16-2008 10:59 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Asther Hors ligne
Membre

Messages : 55
Inscription : Aug 2008
Réputation : 0
Message : #37
RE: [Résolu] For contre Foreach
Qu'est ce que tu entend par "itères par filtre" ca m'interesse ça 34

ca doit etre l'iterateur recurssif non?
(Ce message a été modifié le : 08-16-2008 11:24 PM par Asther.)
08-16-2008 11:18 PM
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
oxman Hors ligne
Membre

Messages : 746
Inscription : May 2008
Réputation : 10
Message : #38
RE: [Résolu] For contre Foreach
http://fr.php.net/manual/fr/language.oop...ations.php

Et en gros tu ferais :
$it = new MyIterator($values);
$it->setFilter('Bouh')

Et ensuite dan tes méthodes d'itérations tu itères selon le filtre spécifié.
J'ai du mal à trouver ça propre.
08-16-2008 11:23 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Asther Hors ligne
Membre

Messages : 55
Inscription : Aug 2008
Réputation : 0
Message : #39
RE: [Résolu] For contre Foreach
Justement je suis entrain d'essayer de mettre ça proprement:

Code PHP :
    class Connection {
    

                public 
$result null;
                public 
$connect;
                public 
$SqlOperator;



        public function 
__construct($sql) {
            
            require(
'protect/connect.php');
            
$this->BDD_host $BDD_identifiants['Host'];
            
$this->BDD_user $BDD_identifiants['User'];
            
$this->BDD_pass $BDD_identifiants['Pass'];
            
$this->BDD_bdd $BDD_identifiants['Bdd'];
        

        
            static 
$connect null;
            if(
null === $mysqli) {
            
                if(!
$connect = new mysqli($this->BDD_host$this->BDD_user$this->BDD_pass$this->BDD_bdd)){
            
                    throw new 
Exception ('Erreur: impossible de se connecter a la base de données.');
                
                }
            }
            
            if(empty(
$sql)){
            
                print 
'Erreur: la requette est vide.';
                exit();
            
            }
            
            if(!
$this->result $connect->query($sql)){
            
                throw new 
Exception ('Erreur: dans la requete SQL.');
                exit();
                
            }
            }
        public function 
SqlOperator(){
            
            
$var $this->result;
            if(!
$var){
                print 
'aucuns resultats trouvé.';
                exit();
            }
            return 
$var;
            
        }

        public function 
__destruct(){
        
            if(!
$this->deconnection mysqli_close){
                throw new 
Exception ('Impossible de fermer la base de données!');
                exit();
                
            }
        }
    }

    class 
Iteration extends Connection implements Iterator {
    
                public 
$current null;
                public 
$key 0;
                public 
$rewind;
                public 
$valid;
                protected 
$sql null;    
            
            
        public function 
current(){
        
            return 
$this->current;
                if(!
$this->current){
                    throw new 
Exception ('Erreur: le retour est vide ou inexistant.');
                    exit();
                }
            
        }
        public function 
key() {
        
            return 
$this->key;
            
        }
        public function 
next(){

            
$this->current $this->result->fetch_assoc();
            
$this->key++;
            
        }
        public function 
rewind(){
        
            
$this->result->data_seek(0);
            
$this->key = -1;
            
$this->next();
            
        }
        public function 
valid() {
        
            return 
is_array($this->current);
            
        }    

    }
    
    
    class 
Tableau_Iterator implements RecursiveIterator{
    
                private 
$tab = array();
                private 
$pas;

        public function 
__construct(array $array,$pas 1)
        {
            
$this->tab $array;
            
$this->pas = (int)$pas;
        }

        public function 
valid()
        {
            return 
array_key_exists(key($this->tab),$this->tab);
        }

        public function 
next()
        {
            for (
$i=1$i<=$this->pas;$i++)
            {
                
next($this->tab);
            }
            return 
$this;
        }

        public function 
rewind()
            {
            
reset($this->tab);
            return 
$this;
            }

        public function 
key()
            {
            return 
key($this->tab);
            }

        public function 
current()
            {
            return 
current($this->tab);
            }

        public function 
hasChildren()
            {
            return 
is_array(current($this->tab));
            }

        public function 
getChildren()
            {
            return new 
self(current($this->tab));
            }
    }

    
    class 
Iterate{
    
            public 
$var1;

        function 
IterateThis($req,$champs,$var1){    
            
$search = new Iteration($req);

            foreach(
$search as $clef => $occurences) {
                
$resultat[] = $occurences;
            }

            if(!
$resultat){
                print 
'resultat inéxistant';
                exit();
            }
    
            
$result = new RecursiveIteratorIterator(new Tableau_Iterator($resultat,1));


            foreach(
$resultat AS $clef=>$occurences){
            
                for(
$i 0$i count($champs); $i++){//je calcule le nombre d'entrée a recherché contenu das le array "champs"
                    
                    
$receipt $champs[$i];
                    
$var1 $occurences[$receipt].' ';
    
                }
            }
            return 
$var1;
        }
    } 

en fait j'itére la requete et ensuite je ré-itére le résultat (recurssiveIterator) pour récupérer ce que je veut mais c'est propre à une intérogation BDD.

Mais j'avoue que j'ai fait ça car, pas mal d'amis me chante les louange de la SPL, alors bon j'essai quoi 34" mais c'est vrai que je ne discerne pas trop encore l'intéret mis a part un code qui a de la gueule 45 .
08-16-2008 11:33 PM
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
oxman Hors ligne
Membre

Messages : 746
Inscription : May 2008
Réputation : 10
Message : #40
RE: [Résolu] For contre Foreach
La SPL c'est le fait de pouvoir coder et intégrer facilement des modules en C dans PHP pour étendre ses fonctions.
http://fr.php.net/manual/fr/book.spl.php
08-16-2008 11:45 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Poster une réponse 



ContactJeuWeb (JeuPHP) - Crée ton jeu par navigateurRetourner en hautRetourner au contenuVersion bas-débit (Archivé)Syndication RSS