Con los chicos de 6toB comenzamos a hacer una clase para un tipo abstracto llamado "BolsaSinOrden".
La idea es que sea una bolsa donde se puedan meter "cosas" que no admita repetidos (sin dar un error) y que cuando le "pida uno" me lo de, sin repetir y en un orden aleatorio (y sin fin, o sea que siempre le pueda pedir uno, y cuando me dio todos, vuelva a empezar).
Les dejo la primer version que tiene funcioonalidad para crear la bolsa, meter cosas y pedir cosas. Proximamente agregaremos quitar y otras funcionalidades. Para probarlo, pueden reemplazar el "\n" de los echos por "
" asi se ve lindo en el browser.
Gutes.
<?php
class BolsaSinOrden{
private $elems;
private $tam;
private $devueltos;
function __construct(){
$this->elems = array();
$this->devueltos = array();
$this->tam = 0;
}
public function ponerUno($e){
foreach ($this->elems as $elem){
if ($elem == $e)
return;
}
$this->elems[] = $e;
$this->tam++;
}
public function dameUno(){
$aDevolver = rand(0, $this->tam -1);
if (!isset($this->devueltos[$aDevolver])){
$this->devueltos[$aDevolver] = 1;
return $this->elems[$aDevolver];
}else{
if (sizeof($this->devueltos) == $this->tam) {
$this->devueltos = array();
return $this->dameUno();
}
return $this->dameUno();
}
}
public function imprimirBolsa(){
echo "{";
foreach ($this->elems as $e){
echo $e . " ";
}
echo "}";
}
}
$miBolsa = new BolsaSinOrden();
$miBolsa->ponerUno(2);
$miBolsa->ponerUno(112);
$miBolsa->ponerUno(2222);
$miBolsa->ponerUno(2);
$miBolsa->ponerUno(2);
$miBolsa->ponerUno(2);
$miBolsa->ponerUno(2);
$miBolsa->ponerUno(2);
$miBolsa->ponerUno(515152);
$miBolsa->ponerUno(3535);
$miBolsa->ponerUno(2);
$miBolsa->ponerUno(2);
$miBolsa->imprimirBolsa();
echo "\n";
echo "me dio:" . $miBolsa->dameUno() ."\n";
echo "me dio:" . $miBolsa->dameUno() ."\n";
echo "me dio:" . $miBolsa->dameUno() ."\n";
echo "me dio:" . $miBolsa->dameUno() ."\n";
echo "me dio:" . $miBolsa->dameUno() ."\n";
echo "me dio:" . $miBolsa->dameUno() ."\n";
echo "me dio:" . $miBolsa->dameUno() ."\n";
echo "me dio:" . $miBolsa->dameUno() ."\n";
?>