jobo: Codeoptimierung - wiederkehrende Elemente

Beitrag lesen

Hallo,

// sucht aus einer Datei alle Zeilen, in denen die übergebenen Wert in der Spalte zutriffen
private static function _getRowsByColsValue($tablePath, $colsHash) {
$fileHandle = @fopen($tablePath,"r");
$rows = array();
$firstRow = false;
if ($fileHandle) {
while (($row = fgetcsv($fileHandle)) !== false) {
//exclude empty lines
if (!is_array($row)) {
continue;
}
// Whitespaces/Leerzeichen am Anfang und Ende einer jeden Zelle entfernen
// keine Leerzeichen überhaupt in einer Zeile
if(trim(implode($row))) {
$row = array_map("trim",$row);
if($firstRow === false) {
$firstRowFlipped = array_flip($row);
$firstRow = $row;
}

  
Ich habe jetzt diesen Teil, der in beiden Funktionen ident ist, in den Konstruktor gepackt bzw. noch eine Unterfunktion \_setFirstLine() gebaut.  
  
Jetzt habe ich zwar einiges mehr an Klassenvariablen und auch an Unterfunktionen, dafür ist das ganze aber irgendwie sauberer aufgeteilt, so dass man über die statschen getter bzw. eine (noch) private \_init() funktion und einen Parameter im Konstruktor steuern kann, ob bei der Iteration gleich mit nach Zeilen gesucht werden soll oder nicht.  
  
Wens interessiert hier mal die komplette Klasse (da ich nicht weiß, wie sinnvoll jetzt Auszüge präsentieren):  
~~~php
  
<?php  
class SearchRefactored  
{  
	  
	private $_fileHandle = NULL;  
	private $_firstRow = false;  
	private $_firstRowFlipped = false;  
	private $_actualTablePath = NULL;  
	private $_actualRow = NULL;  
  
	private static $_possibleValuesPerColumn = array();  
	private static $_rowsByColsValue = array();  
	  
	private static function _getTablesList() {  
		$tablesList = array();  
		return glob($GLOBALS["dataDir"] . "*.csv");  
	}  
	  
	private function __construct($tablePath, $colsHash = false) {  
		$this->_fileHandle = @fopen($tablePath,"r");  
		if ($this->_fileHandle) {  
			  
			$this->_setFirstRow();  
			  
			// if there is a search, then we need the columncount by columnname  
			if (is_array($colsHash)) {  
				$this->_firstRowFlipped = array_flip($this->_firstRow);  
			}		  
			  
			while (($row = fgetcsv($this->_fileHandle)) !== false) {  
				//exclude empty lines  
				if (!$this->_validRow($row)) {  
					continue;  
				}  
				$this->_actualRow = array_map("trim",$row);  
				  
				$this->_setPossibleValuesPerColumn();  
				  
				if (is_array($colsHash)) {  
					$this->_firstRowFlipped = array_flip($this->_firstRow);  
					$this->_setRowsByColsValue($colsHash);  
				}  
			}  
			// merci handle, go free  
			fclose($this->_fileHandle);  
		}	else {  
			throw new Exception ("No Database named " . $tablePath . " found.");  
		}  
	}  
	  
	//sets first Row which contains column titles  
	private function _setFirstRow() {  
		while ($this->_firstRow === false) {  
			$row = fgetcsv($this->_fileHandle);  
			//exclude empty lines  
			if (!$this->_validRow($row)) {  
				continue;  
			}  
			// Whitespaces/Leerzeichen am Anfang und Ende einer jeden Zelle entfernen  
			// keine Leerzeichen überhaupt in einer Zeile  
			$row = array_map("trim",$row);  
			$this->_firstRow = $row;  
		}  
	}  
	  
	// checks if row ist empty  
	private function _validRow($row) {  
		if (is_array($row) && trim(implode($row)) != "") {  
			return true;  
		}  
		return false;  
	}  
	  
	private function _setPossibleValuesPerColumn() {  
		foreach($this->_actualRow as $colNr => $cellValue) {  
			if($this->_firstRow[$colNr] != "Text" && $cellValue != "") {  
				self::$_possibleValuesPerColumn[$this->_firstRow[$colNr]][$cellValue] = $cellValue;  
			}							  
		}  
	}  
	  
	// sucht aus einer Datei alle Zeilen, in denen die übergebenen Wert in der Spalte zutriffen  
	private function _setRowsByColsValue($colsHash) {  
		$filter = true;  
		// walk trough cols hash, which contains $colsHash["colname"] = "searchvalue"  
		foreach($colsHash as $colName => $searchValue) {  
			if($this->_actualRow[$this->_firstRowFlipped[$colName]] != $searchValue) {  
				$filter = false;  
			}							  
		}  
		if($filter) {  
			foreach ($this->_actualRow as $colNr => $cellValue) {  
				$rowAssoc[$this->_firstRow[$colNr]] = $cellValue;  
			}  
			self::$_rowsByColsValue[] = $rowAssoc;  
		}  
	}	  
	  
	private static function _init($colsHash = false) {  
		foreach(self::_getTablesList() as $tablePath) {  
			$csvTable = new self($tablePath, $colsHash);  
		}  
	}  
	  
	// auch in der Suche PHP benutzt  
	public static function getAllPossibleValuesPerColumn() {  
		self::_init();  
		foreach (self::$_possibleValuesPerColumn as $colName => $valueList) {  
			ksort(self::$_possibleValuesPerColumn[$colName]);  
		}  
		return self::$_possibleValuesPerColumn;  
	}  
  
	// aufgerufen aus der suche.php  
	public static function getRowsByColsValue($colsHash) {  
		self::_init($colsHash);  
		return self::$_rowsByColsValue;  
	}  
}  

Gruß

jobo