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