- array_reverse: documentation ( source)
- reset: documentation ( source)
- end: documentation ( source)
- array_values: documentation ( source)
- implode: documentation ( source)
- key: documentation ( source)
- range: documentation ( source)
<?php
class Odometer {
public function __construct(array $values, $max_places = 0){
$this->values = array_values($values);
$this->max_places = $max_places;
reset($values);
$this->register[0] = key($values);
end($values);
$this->limit = key($values);
}
public function iterate($force = false){
$rollback = $this->register;
$this->register[0]++;
for($i = 0; $i < count($this->register); $i++){
if($this->register[$i] > $this->limit){
$this->register[$i] = 0;
if(isset($this->register[$i+1])){
$this->register[$i+1]++;
} else {
if($this->max_places && count($this->register)+1 > $this->max_places && !$force){
$this->register = $rollback;
return;
}
$this->register[$i+1] = 0;
}
}
}
}
public function setMeter(){
for($i = 0; $i < count($this->register); $i++){
$this->meter[$i] = $this->values[$this->register[$i]];
}
}
public function readMeter(){
$this->setMeter();
return '[' . implode('][', array_reverse($this->meter)) . ']' . "\n";
}
}
$o = new Odometer(range('a','c'), 2);
echo $o->readMeter();
for($i = 0; $i < 20; $i++){
$o->iterate(false);
echo $o->readMeter();
}