<?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);