123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- <?php
- class testDataFileIterator implements Iterator
- {
- protected $file;
- protected $key = 0;
- protected $current;
- public function __construct($file)
- {
- $this->file = fopen($file, 'r');
- }
- public function __destruct()
- {
- fclose($this->file);
- }
- public function rewind()
- {
- rewind($this->file);
- $this->current = $this->_parseNextDataset();
- $this->key = 0;
- }
- public function valid()
- {
- return !feof($this->file);
- }
- public function key()
- {
- return $this->key;
- }
- public function current()
- {
- return $this->current;
- }
- public function next()
- {
- $this->current = $this->_parseNextDataset();
- $this->key++;
- }
- private function _parseNextDataset()
- {
- // Read a line of test data from the file
- do {
- // Only take lines that contain test data and that aren't commented out
- $testDataRow = trim(fgets($this->file));
- } while (($testDataRow > '') && ($testDataRow{0} === '#'));
- // Discard any comments at the end of the line
- list($testData) = explode('//',$testDataRow);
- // Split data into an array of individual values and a result
- $dataSet = $this->_getcsv($testData, ',', "'");
- foreach($dataSet as &$dataValue) {
- $dataValue = $this->_parseDataValue($dataValue);
- }
- unset($dataValue);
- return $dataSet;
- }
- private function _getcsv($input, $delimiter, $enclosure)
- {
- if (function_exists('str_getcsv')) {
- return str_getcsv($input, $delimiter, $enclosure);
- }
- $temp = fopen('php://memory', 'rw');
- fwrite($temp, $input);
- rewind($temp);
- $data = fgetcsv($temp, strlen($input), $delimiter, $enclosure);
- fclose($temp);
- if ($data === false) {
- $data = array(null);
- }
- return $data;
- }
- private function _parseDataValue($dataValue) {
- // discard any white space
- $dataValue = trim($dataValue);
- // test for the required datatype and convert accordingly
- if (!is_numeric($dataValue)) {
- if($dataValue == '') {
- $dataValue = NULL;
- } elseif($dataValue == '""') {
- $dataValue = '';
- } elseif(($dataValue[0] == '"') && ($dataValue[strlen($dataValue)-1] == '"')) {
- $dataValue = substr($dataValue,1,-1);
- } elseif(($dataValue[0] == '{') && ($dataValue[strlen($dataValue)-1] == '}')) {
- $dataValue = explode(';',substr($dataValue,1,-1));
- foreach($dataValue as &$dataRow) {
- if (strpos($dataRow,'|') !== FALSE) {
- $dataRow = explode('|',$dataRow);
- foreach($dataRow as &$dataCell) {
- $dataCell = $this->_parseDataValue($dataCell);
- }
- unset($dataCell);
- } else {
- $dataRow = $this->_parseDataValue($dataRow);
- }
- }
- unset($dataRow);
- } else {
- switch (strtoupper($dataValue)) {
- case 'NULL' : $dataValue = NULL; break;
- case 'TRUE' : $dataValue = TRUE; break;
- case 'FALSE' : $dataValue = FALSE; break;
- }
- }
- } else {
- if (strpos($dataValue,'.') !== FALSE) {
- $dataValue = (float) $dataValue;
- } else {
- $dataValue = (int) $dataValue;
- }
- }
- return $dataValue;
- }
- }
|