Bird
Raised Fist0
PHPprogramming~10 mins

Iterator interface implementation in PHP - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Iterator interface implementation
Create Iterator Object
↓
Call rewind() to start
↓
Check valid()
↓
Get current()
↓
Get key()
↓
Move next()
↩Back to Check valid()
This flow shows how PHP's Iterator interface methods control looping: start with rewind(), then check valid(), get current() and key(), move next(), repeat until valid() is false.
Execution Sample
PHP
<?php
class MyIterator implements Iterator {
  private array $items = ["a", "b", "c"];
  private int $index = 0;
  public function rewind() { $this->index = 0; }
  public function current() { return $this->items[$this->index]; }
  public function key() { return $this->index; }
  public function next() { $this->index++; }
  public function valid() { return isset($this->items[$this->index]); }
}
$it = new MyIterator();
foreach ($it as $key => $value) {
  echo "$key:$value ";
}
?>
This code defines a class implementing Iterator to loop over an array and print keys and values.
Execution Table
StepMethod CalledIndex Valuevalid() ResultOutputNext Action
1rewind()0trueCheck valid()
2valid()0trueGet current() and key()
3current(), key()0true0:anext()
4next()1trueCheck valid()
5valid()1trueGet current() and key()
6current(), key()1true1:bnext()
7next()2trueCheck valid()
8valid()2trueGet current() and key()
9current(), key()2true2:cnext()
10next()3falseExit loop
11valid()3falseStop iteration
💡 Index reaches 3, valid() returns false because no item at index 3, loop ends.
Variable Tracker
VariableStartAfter 1After 2After 3After 4After 5After 6After 7Final
indexundefined00112233
Key Moments - 3 Insights
Why does the loop stop after index 3 even though the array has 3 items?
Because valid() checks if the current index exists in the array. At index 3, no item exists, so valid() returns false and the loop stops (see execution_table step 10).
What does rewind() do before the loop starts?
rewind() resets the index to 0 so iteration starts from the first item (see execution_table step 1).
Why do current() and key() get called after valid() returns true?
Because valid() confirms the current index is valid, then current() returns the item and key() returns the index for use in the loop (see execution_table steps 2 and 3).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the index value after the second call to next()?
A2
B3
C1
D0
💡 Hint
Check the 'index value' column at step 7 where next() is called the second time.
At which step does valid() first return false?
AStep 9
BStep 10
CStep 11
DStep 8
💡 Hint
Look at the 'valid() Result' column to find when it changes to false.
If rewind() set index to 1 instead of 0, what would be the first output key?
A0
B2
C1
DUndefined
💡 Hint
Check variable_tracker and execution_table step 1 for rewind() effect on index.
Concept Snapshot
Iterator interface requires these methods:
- rewind(): reset position
- current(): get current item
- key(): get current key
- next(): move forward
- valid(): check if current position is valid
PHP foreach calls these methods in this order to loop over objects implementing Iterator.
Full Transcript
This visual trace shows how PHP's Iterator interface works step-by-step. First, rewind() sets the index to 0. Then valid() checks if the current index exists in the array. If yes, current() returns the item and key() returns the index. Then next() moves the index forward. This repeats until valid() returns false, meaning no more items. The loop stops. The variable 'index' changes from undefined to 0 at rewind, then increments each next() call. This process controls how foreach loops over objects implementing Iterator.

Practice

(1/5)
1. Which of the following methods is NOT required when implementing the Iterator interface in PHP?
easy
A. sort()
B. current()
C. next()
D. rewind()

Solution

  1. Step 1: Recall Iterator interface methods

    The Iterator interface requires implementing rewind(), current(), key(), next(), and valid() methods.
  2. Step 2: Identify the method not in Iterator

    The sort() method is not part of the Iterator interface; it is unrelated to iteration.
  3. Final Answer:

    sort() -> Option A
  4. Quick Check:

    Iterator methods exclude sort() [OK]
Hint: Remember: Iterator needs rewind, current, key, next, valid only [OK]
Common Mistakes:
  • Confusing sort() as part of Iterator
  • Forgetting to implement key() or valid()
  • Thinking rewind() is optional
2. Which of the following is the correct syntax to declare a class MyIterator that implements the Iterator interface?
easy
A. class MyIterator implements Iterator { }
B. class MyIterator extends Iterator { }
C. class MyIterator uses Iterator { }
D. class MyIterator interface Iterator { }

Solution

  1. Step 1: Recall PHP interface implementation syntax

    In PHP, a class implements an interface using the keyword 'implements'.
  2. Step 2: Check each option's syntax

    class MyIterator implements Iterator { } uses 'implements' correctly. The other options use invalid keywords or syntax.
  3. Final Answer:

    class MyIterator implements Iterator { } -> Option A
  4. Quick Check:

    Use 'implements' keyword for interfaces [OK]
Hint: Use 'implements' keyword to implement interfaces in PHP [OK]
Common Mistakes:
  • Using 'extends' instead of 'implements' for interfaces
  • Using 'uses' or 'interface' keywords incorrectly
  • Missing curly braces after class declaration
3. What will be the output of the following PHP code?
$items = ['a', 'b', 'c'];

class MyIterator implements Iterator {
    private array $items;
    private int $index = 0;

    public function __construct(array $items) {
        $this->items = $items;
    }

    public function current() {
        return $this->items[$this->index];
    }

    public function key() {
        return $this->index;
    }

    public function next(): void {
        $this->index++;
    }

    public function rewind(): void {
        $this->index = 0;
    }

    public function valid(): bool {
        return isset($this->items[$this->index]);
    }
}

$iterator = new MyIterator($items);
foreach ($iterator as $key => $value) {
    echo "$key:$value ";
}
medium
A. a:b c:d e:f
B. 0:a 1:b 2:c
C. 0:0 1:1 2:2
D. Error: Undefined variable

Solution

  1. Step 1: Understand the iterator implementation

    The class stores items and uses an index to track position. Methods current(), key(), next(), rewind(), and valid() are correctly implemented.
  2. Step 2: Trace the foreach loop output

    foreach uses key() and current() to print "key:value" pairs. Indexes 0,1,2 correspond to 'a','b','c'. Output is "0:a 1:b 2:c "
  3. Final Answer:

    0:a 1:b 2:c -> Option B
  4. Quick Check:

    Iterator keys and values match array indexes and elements [OK]
Hint: Trace index and current() output for each loop iteration [OK]
Common Mistakes:
  • Confusing keys with values
  • Forgetting to implement valid() correctly
  • Expecting output without spaces
4. Consider this broken iterator class:
class BrokenIterator implements Iterator {
    private array $data = [1, 2, 3];
    private int $pos = 0;

    public function current() {
        return $this->data[$this->pos];
    }

    public function key() {
        return $this->pos;
    }

    public function next() {
        $this->pos++;
    }

    public function rewind() {
        $this->pos = 0;
    }

    public function valid() {
        return $this->pos < count($this->data);
    }
}

What is the main issue that could cause unexpected behavior when using this iterator in a foreach loop?
medium
A. The next() method does not have a void return type
B. The valid() method should use isset() instead of count()
C. The valid() method returns a boolean but should return an integer
D. The next() and rewind() methods lack return type declarations

Solution

  1. Step 1: Check method signatures against Iterator interface

    Iterator interface requires next() and rewind() to have void return type declarations.
  2. Step 2: Identify missing return types

    In the code, next() and rewind() lack ': void' return type, which can cause compatibility issues in strict mode.
  3. Final Answer:

    Missing void return types in next() and rewind() -> Option D
  4. Quick Check:

    next() and rewind() must declare void return type [OK]
Hint: Check method signatures match interface exactly including return types [OK]
Common Mistakes:
  • Ignoring return type declarations
  • Thinking valid() must return integer
  • Confusing isset() and count() usage in valid()
5. You want to create a custom iterator EvenNumbers that iterates over only even numbers from a given array. Which implementation of the valid() method correctly skips odd numbers during iteration?
hard
A. public function valid(): bool { return isset($this->items[$this->index]); }
B. public function valid(): bool { return $this->items[$this->index] % 2 === 0; }
C. public function valid(): bool { while (isset($this->items[$this->index]) && $this->items[$this->index] % 2 !== 0) { $this->index++; } return isset($this->items[$this->index]); }
D. public function valid(): bool { return $this->index < count($this->items); }

Solution

  1. Step 1: Understand the goal of skipping odd numbers

    The iterator must advance the index until it points to an even number or end of array.
  2. Step 2: Analyze each valid() implementation

    public function valid(): bool { while (isset($this->items[$this->index]) && $this->items[$this->index] % 2 !== 0) { $this->index++; } return isset($this->items[$this->index]); } uses a while loop to skip odd numbers by incrementing index, then checks if current index exists. The other options do not skip odd numbers properly.
  3. Final Answer:

    while loop in valid() to skip odd numbers -> Option C
  4. Quick Check:

    valid() must skip odd values to find even numbers [OK]
Hint: Use a loop inside valid() to skip unwanted elements [OK]
Common Mistakes:
  • Returning true without skipping odd numbers
  • Not checking if index exists before accessing array
  • Using valid() only to check index range
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard