oxman
Membre
Messages : 746
Inscription : May 2008
Réputation : 10
|
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 |
|
Asther
Membre
Messages : 55
Inscription : Aug 2008
Réputation : 0
|
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)  .
|
|
| 08-16-2008 08:44 PM |
|
Sephi-Chan
Administrateur
      
Messages : 4,492
Inscription : Aug 2006
|
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+()<=>  .
Sephi-Chan
www.sephi-chan.fr
|
|
| 08-16-2008 09:10 PM |
|
Asther
Membre
Messages : 55
Inscription : Aug 2008
Réputation : 0
|
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
(Ce message a été modifié le : 08-16-2008 09:18 PM par Asther.)
|
|
| 08-16-2008 09:16 PM |
|
oxman
Membre
Messages : 746
Inscription : May 2008
Réputation : 10
|
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 |
|
Sephi-Chan
Administrateur
      
Messages : 4,492
Inscription : Aug 2006
|
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.
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 |
|
Asther
Membre
Messages : 55
Inscription : Aug 2008
Réputation : 0
|
RE: [Résolu] For contre Foreach
Qu'est ce que tu entend par "itères par filtre" ca m'interesse ça
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 |
|
oxman
Membre
Messages : 746
Inscription : May 2008
Réputation : 10
|
RE: [Résolu] For contre Foreach
|
|
| 08-16-2008 11:23 PM |
|
Asther
Membre
Messages : 55
Inscription : Aug 2008
Réputation : 0
|
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  " mais c'est vrai que je ne discerne pas trop encore l'intéret mis a part un code qui a de la gueule  .
|
|
| 08-16-2008 11:33 PM |
|
oxman
Membre
Messages : 746
Inscription : May 2008
Réputation : 10
|
RE: [Résolu] For contre Foreach
|
|
| 08-16-2008 11:45 PM |
|