User Tools

Site Tools


php:kompost:arrayobject

[PHP] Extended ArrayObject

<?php
class A{
	private $value;
	public function __construct($value){$this->value = $value;}
	public function getValue(){return $this->value;}
}
 
class Verwaltung extends ArrayObject{
	/** $array ist hier nur ein Beispiel. Dieser Array wird später aus der DB geladen */
	public function __construct($array, $filter = false){
		if (is_array($filter)) $array = self::multiFilter($array, $filter);
		else if ($filter) $array = self::singleFilter($array, $filter);
		parent::__construct($array, ArrayObject::ARRAY_AS_PROPS);
	}
	/** Eingebauter Filter für ein Filterstring */
	public function filterByFilterString($filterString){
		return self::singleFilter($this, $filterString);
	}
	/** Eingebauter Filter für ein Value */
	public function filterBySingleValue($value){
		return self::multiFilter($this, $value);
	}
	/** Eingebauter Filter für mehrere Values */
	public function filterByArray($valueArray){
		return self::multiFilter($this, $valueArray);
	}
	private static function singleFilter($arrayA, $filterString){
		return array_filter(self::convertToArray($arrayA), create_function('$obj', $filterString));
	}
	private static function multiFilter($arrayA, $valueArray){
		return array_uintersect(self::convertToArray($arrayA), self::convertToArray($valueArray),
			create_function('$a, $b',
				'$a = is_object($a)? $a->getValue(): $a;
				$b = is_object($b)? $b->getValue(): $b;
				return strcasecmp($a." ", $b." ");')
		);
	}
	private static function convertToArray($variant){
		if ($variant instanceof ArrayObject) return $variant->getArrayCopy();
		elseif (is_array($variant)) return $variant;
		elseif ($variant instanceof A) return array($variant);
		else return array($variant);
	}
}
 
$testDaten = array('k1' => new A(11), 'k2'=>new A(22), 'k3'=>new A(33));
//Construct ohne Datenfilter
$v = new Verwaltung($testDaten);
//Ausgabe aller A
echo "<hr />Ausgabe aller A:<br />";
var_dump($v);
//Ausgabe als Property
echo "<hr />Ausgabe als Property:<br />";
var_dump($v->k2);
//Ausgabe über Index
echo "<hr />Ausgabe über Index:<br />";
var_dump($v['k1']);
//Ausgabe über array_filter
echo "<hr />Ausgabe über array_filter:<br />";
var_dump(array_filter($v->getArrayCopy(), create_function('$obj', 'return $obj->getValue()==22 || $obj->getValue() ==33;')));
 
echo "<hr />Eingebauten filterByFilterString nutzen:<br />";
var_dump($v->filterByFilterString('return $obj->getValue()==22 || $obj->getValue() ==33;'));
 
echo "<hr />Eingebauten filterBySingleValue nutzen:<br />";
var_dump($v->filterBySingleValue(11));
 
echo "<hr />Eingebauten filter2 nutzen:<br />";
var_dump($v->filterByArray(array(11,33)));
 
//Construct mit Datenfilter
$v = new Verwaltung($testDaten, 'return $obj->getValue()==11;');
echo "<hr />Construct mit Datenfilter:<br />";
var_dump($v);
 
//Construct mit Datenfilter
$v = new Verwaltung($testDaten, array(11, 22));
echo "<hr />Construct mit Mehrfachdatenfilter:<br />";
var_dump($v);
?>

Kategorien: CatPhp

php/kompost/arrayobject.txt · Last modified: 11.12.2013 10:41:42 (external edit)