IteratorAggregate interface in PHP - Time & Space Complexity
When using the IteratorAggregate interface in PHP, we want to understand how the time to get items grows as the collection size grows.
We ask: How does looping through the items behave as the list gets bigger?
Analyze the time complexity of this PHP code using IteratorAggregate.
class MyCollection implements IteratorAggregate {
private array $items;
public function __construct(array $items) {
$this->items = $items;
}
public function getIterator(): Traversable {
return new ArrayIterator($this->items);
}
}
$n = 10; // example value for $n
$collection = new MyCollection(range(1, $n));
foreach ($collection as $item) {
// process $item
}
This code creates a collection that can be looped over using IteratorAggregate, returning an iterator over an array of items.
Look at what repeats when looping through the collection.
- Primary operation: Looping through each item in the array inside the iterator.
- How many times: Once for each item in the collection, so n times if there are n items.
As the number of items grows, the loop runs once per item.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 loops |
| 100 | 100 loops |
| 1000 | 1000 loops |
Pattern observation: The number of operations grows directly with the number of items.
Time Complexity: O(n)
This means the time to loop through the collection grows in a straight line with the number of items.
[X] Wrong: "Using IteratorAggregate makes looping slower because it adds extra steps."
[OK] Correct: The interface just provides a way to get the iterator; the main work is still looping through each item once, so the time grows linearly.
Understanding how interfaces like IteratorAggregate affect performance helps you explain your code choices clearly and shows you know how data size impacts speed.
"What if the getIterator method returned a generator instead of an ArrayIterator? How would the time complexity change?"
Practice
What is the main purpose of the IteratorAggregate interface in PHP?
Solution
Step 1: Understand the role of IteratorAggregate
The interface requires implementinggetIterator()which returns an iterator object.Step 2: Connect to foreach usage
This allows the object to be used inforeachloops by providing the iterator externally.Final Answer:
To allow an object to be iterated withforeachby providing an external iterator. -> Option AQuick Check:
IteratorAggregate enables foreach iteration [OK]
- Thinking it sorts data automatically
- Confusing it with string conversion
- Assuming it enforces type checks
Which method must a class implement when it uses the IteratorAggregate interface?
Solution
Step 1: Recall interface requirements
TheIteratorAggregateinterface requires thegetIterator()method.Step 2: Confirm method name
This method must return an iterator object to enable iteration.Final Answer:
getIterator() -> Option CQuick Check:
IteratorAggregate requires getIterator() [OK]
- Using iterate() instead of getIterator()
- Confusing with toArray() method
- Assuming getItems() is required
What will be the output of this PHP code?
<?php
class MyCollection implements IteratorAggregate {
private array $items = [1, 2, 3];
public function getIterator(): Traversable {
return new ArrayIterator($this->items);
}
}
$collection = new MyCollection();
foreach ($collection as $item) {
echo $item . ' ';
}Solution
Step 1: Understand getIterator() return
The method returns anArrayIteratorover the array [1, 2, 3].Step 2: foreach loops over iterator
The foreach loop iterates over the items 1, 2, and 3, echoing each with a space.Final Answer:
1 2 3 -> Option BQuick Check:
foreach prints each item from ArrayIterator [OK]
- Expecting an error because getIterator returns ArrayIterator
- Thinking it prints object instead of values
- Missing the space after each number
Identify the error in this PHP class implementing IteratorAggregate:
<?php
class Numbers implements IteratorAggregate {
private array $nums = [10, 20, 30];
public function getIterator() {
return $this->nums;
}
}Solution
Step 1: Check getIterator() return type
It returns an array, butgetIterator()must return an object implementingTraversable.Step 2: Understand interface contract
Returning an array causes a type error because arrays do not implementTraversable.Final Answer:
getIterator() must return an object implementing Traversable, not an array. -> Option AQuick Check:
getIterator() returns Traversable object [OK]
- Returning array directly from getIterator()
- Thinking private properties cause error here
- Assuming getIterator() must be static
You want to create a class FilteredCollection that implements IteratorAggregate and only iterates over items greater than 5 from an internal array. Which implementation of getIterator() is correct?
<?php
class FilteredCollection implements IteratorAggregate {
private array $items;
public function __construct(array $items) {
$this->items = $items;
}
public function getIterator(): Traversable {
// Which code below is correct?
}
}Solution
Step 1: Filter items greater than 5
Usearray_filterwith a callback to keep only values > 5.Step 2: Return an ArrayIterator over filtered items
Wrap filtered array inArrayIteratorto satisfyTraversablereturn type.Final Answer:
return new ArrayIterator(array_filter($this->items, fn($v) => $v > 5)); -> Option DQuick Check:
Filter then wrap in ArrayIterator [OK]
- Returning unfiltered array directly
- Using array_map instead of array_filter
- Not wrapping result in an iterator object
Ready to prove it?
Pass the test and this pattern moves unknown
