Collections with SPL
Limit Iterator
LimitIterator reads only a selected window from another iterator.
bounded iteration
Wrapping an iterator with `LimitIterator` keeps the loop focused on a smaller range.
Limit Iterator
limit_iterator.php
Replay: real traced execution (multi-file project)
<?php
$offset = 1;
$source = new ArrayIterator(["zero", "one", "two", "three"]);
$window = new LimitIterator($source, $offset, 2);
$items = "";
foreach ($window as $value) {
if ($items === "") {
$items = $value;
} else {
$items = $items . "," . $value;
}
}
echo "offset=" . $offset . "\n";
echo "items=" . $items . "\n";
<?php
$offset = 0;
$source = new ArrayIterator(["zero", "one", "two", "three"]);
$window = new LimitIterator($source, $offset, 2);
$items = "";
foreach ($window as $value) {
if ($items === "") {
$items = $value;
} else {
$items = $items . "," . $value;
}
}
echo "offset=" . $offset . "\n";
echo "items=" . $items . "\n";
<?php
$offset = 2;
$source = new ArrayIterator(["zero", "one", "two", "three"]);
$window = new LimitIterator($source, $offset, 2);
$items = "";
foreach ($window as $value) {
if ($items === "") {
$items = $value;
} else {
$items = $items . "," . $value;
}
}
echo "offset=" . $offset . "\n";
echo "items=" . $items . "\n";
$offset ← 1, $source ← ArrayIterator, $window ← LimitIterator
1<?php2$offset→ 1 = 1; //@offset=0, 23$source→ ArrayIterator = new ArrayIterator(["zero", "one", "two", "three"]);4$window→ LimitIterator = new LimitIterator($sourceArrayIterator, $offset1, 2);5$items→ (empty) = "";6foreach ($window as $value) {foreach ($window as $value)
pass 1 of 25$items = "";6foreach ($windowLimitIterator as $valueone) {7 if ($items === "") {8 $items = $value;$items ← one
6foreach ($window as $value) {7 if ($items(empty) === "") {8 $items→ one = $valueone;9 } else {$items ← one,two
pass 2 of 25$items = "";6foreach ($windowLimitIterator as $valuetwo) {7 if ($items === "") {8 $items = $value;9 } else {10 $items→ one,two = $items . "," . $valuetwo;11 }echo "offset=" . $offset . " ";
14echo "offset=" . $offset1 . "\n";15echo "items=" . $itemsone,two . "\n";outputoffset=1 items=one,two
$offset ← 0, $source ← ArrayIterator, $window ← LimitIterator
1<?php2$offset→ 0 = 0;3$source→ ArrayIterator = new ArrayIterator(["zero", "one", "two", "three"]);4$window→ LimitIterator = new LimitIterator($sourceArrayIterator, $offset0, 2);5$items→ (empty) = "";6foreach ($window as $value) {foreach ($window as $value)
pass 1 of 25$items = "";6foreach ($windowLimitIterator as $valuezero) {7 if ($items === "") {8 $items = $value;$items ← zero
6foreach ($window as $value) {7 if ($items(empty) === "") {8 $items→ zero = $valuezero;9 } else {$items ← zero,one
pass 2 of 25$items = "";6foreach ($windowLimitIterator as $valueone) {7 if ($items === "") {8 $items = $value;9 } else {10 $items→ zero,one = $items . "," . $valueone;11 }echo "offset=" . $offset . " ";
14echo "offset=" . $offset0 . "\n";15echo "items=" . $itemszero,one . "\n";outputoffset=0 items=zero,one
$offset ← 2, $source ← ArrayIterator, $window ← LimitIterator
1<?php2$offset→ 2 = 2;3$source→ ArrayIterator = new ArrayIterator(["zero", "one", "two", "three"]);4$window→ LimitIterator = new LimitIterator($sourceArrayIterator, $offset2, 2);5$items→ (empty) = "";6foreach ($window as $value) {foreach ($window as $value)
pass 1 of 25$items = "";6foreach ($windowLimitIterator as $valuetwo) {7 if ($items === "") {8 $items = $value;$items ← two
6foreach ($window as $value) {7 if ($items(empty) === "") {8 $items→ two = $valuetwo;9 } else {$items ← two,three
pass 2 of 25$items = "";6foreach ($windowLimitIterator as $valuethree) {7 if ($items === "") {8 $items = $value;9 } else {10 $items→ two,three = $items . "," . $valuethree;11 }echo "offset=" . $offset . " ";
14echo "offset=" . $offset2 . "\n";15echo "items=" . $itemstwo,three . "\n";outputoffset=2 items=two,three