Met "foreach" door een object/array lopen.... Iterator class
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 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 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.