3v4l.org

run code in 300+ PHP versions simultaneously
<?php $max = 50; //Fonction qui retourne les multiples d'un diviseur <= max //Logique de calculs $memoryF = memory_get_usage(); function multiplesDe($diviseur, $max) { $result = array(); for($i=0; $i<=$max; $i+=$diviseur) { $result[] = $i; //L'ensemble des résultats dont chargés en mémoire par la fonction } return $result; } //Logique d'affichage //var_dump(multiplesDe(7,$max)); $multiplesDeSept = multiplesDe(7,$max); //Ici se trouve le gros stockage mémoire! foreach(multiplesDe(7,$max) as $i => $multiples) { echo "$i => $multiples<br />"; } // echo memory_get_usage()-$memoryF,"<br />"; //var_dump($multiplesDeSept); //On implémente la classe PHP5 Iterator /* http://fr2.php.net/manual/fr/class.iterator.php abstract public mixed current ( void ) OK abstract public scalar key ( void ) OK abstract public void next ( void ) OK abstract public void rewind ( void ) OK (implémentée) abstract public boolean valid ( void ) OK */ $memoryI = memory_get_usage(); class MultiplesIterator implements Iterator { protected $diviseur,$max; //parametres calculs protected $current, $indiceCurrent; public function __construct($diviseur, $max) { $this->diviseur = $diviseur; $this->max = $max; } public function rewind() { // On revient au début! $this->current = 0; $this->indiceCurrent = 0; } public function valid() { // Condition de fin de boucle! return ($this->current <= $this->max); } public function current() { // retourne la valeur courante ! return $this->current; } public function key() { // retourne l'indice de la velru courante(la clé!) return $this->indiceCurrent; } public function next() { // fait passer au prochain élément! $this->indiceCurrent += 1; $this->current += $this->diviseur; } } $iterator = new MultiplesIterator(7,$max); foreach($iterator as $i => $multiples) { echo "$i => $multiples<br />"; } //Stockage de l'ensemble des résultats dans une liste > peu gourmand. //echo memory_get_usage()-$memoryI,"<br />"; $memoryG = memory_get_usage(); // on implémente la classe Generator! // Yield: Lorsque yield est atteint, la valeur qu’il spécifie est renvoyée à l’appelant, et l’exécution de la fonction est mise en pause // jusqu’à ce que l’appelant demande à ce qu’elle soit continuée. function multiplesDeG($diviseur, $max) { for($i=0,$n=0; $n<=$max; $i++,$n+=$diviseur) { yield $i => $n; //On renvoit directement la valeur à l'appelant: } } $listeMultiples = multiplesDeG(7, $max); foreach($listeMultiples as $i => $multiples) //foreach(multiplesDeG(7, $max) as $i => $multiples) fonctionne aussi! { echo "$i => $multiples<br />"; } // echo memory_get_usage()-$memoryG; var_dump(multiplesDeG(7, $max) instanceof Generator);

preferences:
32.81 ms | 402 KiB | 5 Q