<?php
interface IDBResult {
function FetchAssoc();
function Rewind();
function NumRows();
}
class DBResult implements IDBResult {
private $_records = array(
array('abc' => 'def'),
array('foo' => 'bar'),
array('fizz' => 'buzz'),
);
private $_i = 0;
function FetchAssoc() {
return isset($this->_records[$this->_i]) ? $this->_records[$this->_i++] : null;
}
function Rewind() {
$this->_i = 0;
}
function NumRows() {
return count($this->_records);
}
}
class ResultIterator implements Iterator {
private $_rs;
private $_rec;
private $_index = 0;
private $_onLoad;
function __construct(IDBResult $rs, callable $callback = null) {
$this->_rs = $rs;
$this->_onLoad = $callback ?: function($rec, $i) { return $rec; };
}
public function current() {
return call_user_func_array($this->_onLoad, array($this->_rec, $this->_index));
}
public function key() {
return $this->_index;
}
public function next() {
$this->_rec = $this->_rs->FetchAssoc();
$this->_index++;
}
public function rewind() {
$this->_index = 0;
$this->_rs->Rewind();
$this->_rec = $this->_rs->FetchAssoc();
}
public function valid() {
return $this->_index < $this->_rs->NumRows();
}
}
$rs = new DBResult();
$it = new ResultIterator($rs, function($rec, $i) { return array($i, key($rec), $rec[key($rec)]); });
foreach($it as $rec) {
print_r($rec);
}
preferences:
43.03 ms | 402 KiB | 5 Q