aboutsummaryrefslogtreecommitdiff
path: root/classes
diff options
context:
space:
mode:
Diffstat (limited to 'classes')
-rw-r--r--classes/IsisFinder.php51
-rw-r--r--classes/iterators/IsisEntryIterator.php66
2 files changed, 78 insertions, 39 deletions
diff --git a/classes/IsisFinder.php b/classes/IsisFinder.php
index e4f228d..26430c6 100644
--- a/classes/IsisFinder.php
+++ b/classes/IsisFinder.php
@@ -17,22 +17,13 @@ class IsisFinder extends IsisConnector {
* Next repetition entry and result.
*/
public function nextRepetition($entry = 1, $field) {
- $entry--;
-
- // Query database.
- do {
- $result = $this->read(++$entry);
- if ($entry == $entries) {
- break;
+ foreach(new IsisEntryIterator($this, $entry) as $entry => $result) {
+ if (count($this->getValues($field)) >= 2) {
+ return array($entry, $result);
}
- $values = $this->getValues($field);
- } while (count($values) < 2);
-
- if (count($values) < 2) {
- return FALSE;
}
- return array($entry, $result);
+ return FALSE;
}
/**
@@ -48,22 +39,13 @@ class IsisFinder extends IsisConnector {
* Next occurrence.
*/
public function nextField($entry = 1, $field) {
- $entry--;
-
- // Query database.
- do {
- $result = $this->read(++$entry);
- if ($entry == $entries) {
- break;
+ foreach(new IsisEntryIterator($this, $entry) as $entry => $result) {
+ if (count($this->getValues($field)) > 0) {
+ return array($entry, $result);
}
- $values = $this->getValues($field);
- } while (empty($values));
-
- if (empty($values)) {
- return FALSE;
}
- return array($entry, $result);
+ return FALSE;
}
/**
@@ -82,22 +64,13 @@ class IsisFinder extends IsisConnector {
* Next occurrence.
*/
public function nextSubfield($entry = 1, $field, $subfield) {
- $entry--;
-
- // Query database.
- do {
- $result = $this->read(++$entry);
- if ($entry == $entries) {
- break;
+ foreach(new IsisEntryIterator($this, $entry) as $entry => $result) {
+ if ($this->hasSubfieldInRows($field, $subfield) !== FALSE) {
+ return array($entry, $result);
}
- $has = $this->hasSubfieldInRows($field, $subfield);
- } while ($has === FALSE);
-
- if (!$this->hasSubfield($field, $subfield, $has)) {
- return FALSE;
}
- return array($entry, $result);
+ return FALSE;
}
/**
diff --git a/classes/iterators/IsisEntryIterator.php b/classes/iterators/IsisEntryIterator.php
new file mode 100644
index 0000000..6a1d72c
--- /dev/null
+++ b/classes/iterators/IsisEntryIterator.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * Isis entry iterator. Iterates over all entries in
+ * the database.
+ */
+class IsisEntryIterator implements Iterator
+{
+ private $start;
+ private $entry;
+ private $entries;
+
+ /**
+ * Constructor.
+ *
+ * @param $class
+ * Instance of IsisConnector or child class.
+ *
+ * @param $entry
+ * Start entry number to iterate from.
+ */
+ public function __construct($class, $entry = 1) {
+ // Read the first value.
+ $class->read($entry);
+
+ // Setup.
+ $this->class = $class;
+ $this->entry = $this->start = $entry;
+ $this->entries = $class->entries;
+ }
+
+ /**
+ * Rewind the Iterator to the first element.
+ */
+ function rewind() {
+ $this->entry = $this->start;
+ }
+
+ /**
+ * Return the key of the current element.
+ */
+ function key() {
+ return $this->entry;
+ }
+
+ /**
+ * Return the current element.
+ */
+ function current() {
+ return $this->class->result;
+ }
+
+ /**
+ * Move forward to next element.
+ */
+ function next() {
+ $this->class->read(++$this->entry);
+ }
+
+ /**
+ * Check if there is a current element after calls to rewind() or next().
+ */
+ function valid() {
+ return $this->entry <= $this->entries;
+ }
+}