Met "foreach" door een object/array lopen.... Iterator class
Een leuke class die het gemakkelijk maakt om door een array heen te lopen.
Je kunt hem ook nog uitbreiden met dynamisch benaderen van het array:
public function __get($ID) {
if (array_key_exists($ID, $this->IteratorArray)) {
return $this->IteratorArray[$ID];
} else { return false; }
}
public function __set($ID, $Value) {
$this->IteratorArray[$ID] = $Value;
}
Dus dan kun je dit doen: $Iterator->MaaktAllemaalNietMeerUit = "Geweldig!"
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
// Iterator class voor het lopen door array's in een object...
class clsIterator implements Iterator {
protected $IteratorArray = array(); // --- Iterator Reference ---
public function rewind() { reset($this->IteratorArray); }
public function current() { return current($this->IteratorArray); }
public function key() { return key($this->IteratorArray); }
public function next() { return next($this->IteratorArray); }
public function valid() { $Key = key($this->IteratorArray); return ($Key !== NULL && $Key !== FALSE); }
public function __construct() { $this->SetIteratorArray( $this->IteratorArray); }
public function SetIteratorArray(array &$IteratorArray) { $this->IteratorArray = &$IteratorArray; }
}
// Voorbeeld gebruik:
class clsMyIterator extends clsIterator {
private $prvArray = array("Test" => "Geslaagd");
public function __construct() { $this->SetIteratorArray($this->prvArray); }
}
$Iterator = New clsMyIterator();
foreach($Iterator as $Key => $Value)
{ echo $Key.'='.$Value.'<BR>'; }
?>
// Iterator class voor het lopen door array's in een object...
class clsIterator implements Iterator {
protected $IteratorArray = array(); // --- Iterator Reference ---
public function rewind() { reset($this->IteratorArray); }
public function current() { return current($this->IteratorArray); }
public function key() { return key($this->IteratorArray); }
public function next() { return next($this->IteratorArray); }
public function valid() { $Key = key($this->IteratorArray); return ($Key !== NULL && $Key !== FALSE); }
public function __construct() { $this->SetIteratorArray( $this->IteratorArray); }
public function SetIteratorArray(array &$IteratorArray) { $this->IteratorArray = &$IteratorArray; }
}
// Voorbeeld gebruik:
class clsMyIterator extends clsIterator {
private $prvArray = array("Test" => "Geslaagd");
public function __construct() { $this->SetIteratorArray($this->prvArray); }
}
$Iterator = New clsMyIterator();
foreach($Iterator as $Key => $Value)
{ echo $Key.'='.$Value.'<BR>'; }
?>
Je kunt hem ook nog uitbreiden met dynamisch benaderen van het array:
public function __get($ID) {
if (array_key_exists($ID, $this->IteratorArray)) {
return $this->IteratorArray[$ID];
} else { return false; }
}
public function __set($ID, $Value) {
$this->IteratorArray[$ID] = $Value;
}
Dus dan kun je dit doen: $Iterator->MaaktAllemaalNietMeerUit = "Geweldig!"
ArrayObject doet dit beter ;)
ArrayObject fill 0.01441502571106
ArrayObject read_key 0.018320083618164
ArrayObject read_foreach 2.1559031009674
array() fill 0.012364864349365
array() read_key 0.013092041015625
array() read_foreach 0.011217832565308
Maar wel 200x sneller... :-)
Maar bedankt voor je reactie je hebt me nog op een leuk idee gebracht...
ArrayObject read_key 0.018320083618164
ArrayObject read_foreach 2.1559031009674
array() fill 0.012364864349365
array() read_key 0.013092041015625
array() read_foreach 0.011217832565308
Maar wel 200x sneller... :-)
Maar bedankt voor je reactie je hebt me nog op een leuk idee gebracht...
Gewijzigd op 15/01/2011 22:09:19 door Roger Keulen
Ik zie het bij het commentaar staan ja.
Ik denk alleen niet dat dit nog geldt bij de huidige PHP versie. Sinds het begin van PHP 5 is het gebruik van objecten veel sneller geworden.
En trouwens, dit vergelijkt ArrayObject met een native array, niet met jouw klasse.
Ik denk alleen niet dat dit nog geldt bij de huidige PHP versie. Sinds het begin van PHP 5 is het gebruik van objecten veel sneller geworden.
En trouwens, dit vergelijkt ArrayObject met een native array, niet met jouw klasse.