next()) { if ($column) { $result[] = $record[$column]; } else { $result[] = $record[key($record)]; } } return $result; } /** * Return an array containing all values in the leftmost column, where the keys are the * same as the values. * * @return array */ public function keyedColumn() { $column = array(); foreach ($this as $record) { $val = $record[key($record)]; $column[$val] = $val; } return $column; } /** * Return a map from the first column to the second column. * * @return array */ public function map() { $column = array(); foreach ($this as $record) { $key = reset($record); $val = next($record); $column[$key] = $val; } return $column; } /** * Returns the next record in the iterator. * * @return array */ public function record() { return $this->next(); } /** * Returns the first column of the first record. * * @return string */ public function value() { $record = $this->next(); if ($record) return $record[key($record)]; } /** * Return an HTML table containing the full result-set * * @return string */ public function table() { $first = true; $result = "\n"; foreach ($this as $record) { if ($first) { $result .= ""; foreach ($record as $k => $v) { $result .= " "; } $result .= " \n"; } $result .= ""; foreach ($record as $k => $v) { $result .= " "; } $result .= " \n"; $first = false; } $result .= "
" . Convert::raw2xml($k) . "
" . Convert::raw2xml($v) . "
\n"; if ($first) return "No records found"; return $result; } /** * Iterator function implementation. Rewind the iterator to the first item and return it. * Makes use of {@link seek()} and {@link numRecords()}, takes care of the plumbing. * * @return array */ public function rewind() { if ($this->queryHasBegun && $this->numRecords() > 0) { $this->queryHasBegun = false; $this->currentRecord = null; return $this->seek(0); } } /** * Iterator function implementation. Return the current item of the iterator. * * @return array */ public function current() { if (!$this->currentRecord) { return $this->next(); } else { return $this->currentRecord; } } /** * Iterator function implementation. Return the first item of this iterator. * * @return array */ public function first() { $this->rewind(); return $this->current(); } /** * Iterator function implementation. Return the row number of the current item. * * @return int */ public function key() { return $this->rowNum; } /** * Iterator function implementation. Return the next record in the iterator. * Makes use of {@link nextRecord()}, takes care of the plumbing. * * @return array */ public function next() { $this->queryHasBegun = true; $this->currentRecord = $this->nextRecord(); $this->rowNum++; return $this->currentRecord; } /** * Iterator function implementation. Check if the iterator is pointing to a valid item. * * @return bool */ public function valid() { if (!$this->queryHasBegun) $this->next(); return $this->currentRecord !== false; } /** * Return the next record in the query result. * * @return array */ abstract public function nextRecord(); /** * Return the total number of items in the query result. * * @return int */ abstract public function numRecords(); /** * Go to a specific row number in the query result and return the record. * * @param int $rowNum Row number to go to. * @return array */ abstract public function seek($rowNum); }