Yield keyword behavior in PHP - Time & Space Complexity
Let's explore how using the yield keyword affects the time it takes for a PHP function to run.
We want to know how the number of steps changes as the input grows when using yield.
Analyze the time complexity of the following code snippet.
function countToN(int $n) {
for ($i = 1; $i <= $n; $i++) {
yield $i;
}
}
foreach (countToN(5) as $number) {
echo $number . " ";
}
This code yields numbers from 1 to n one by one, instead of returning all at once.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The
forloop runs from 1 ton, yielding one value each time. - How many times: Exactly
ntimes, once per number.
Each number from 1 to n is processed one at a time, so the steps grow directly with n.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 steps (yield 10 times) |
| 100 | 100 steps (yield 100 times) |
| 1000 | 1000 steps (yield 1000 times) |
Pattern observation: The number of steps grows in a straight line as n increases.
Time Complexity: O(n)
This means the time to run grows directly in proportion to the size of the input n.
[X] Wrong: "Using yield makes the function run instantly regardless of input size."
[OK] Correct: yield delays output but the loop still runs n times, so the total work grows with n.
Understanding how yield affects time helps you explain efficient data processing in real projects.
What if we changed the loop to yield only every other number? How would the time complexity change?
Practice
yield keyword do in a PHP function?Solution
Step 1: Understand yield behavior
Theyieldkeyword pauses the function and returns a value without ending it.Step 2: Compare with return
Unlikereturn,yieldallows the function to resume and produce more values later.Final Answer:
It returns a value and pauses the function, resuming later to produce more values. -> Option AQuick Check:
Yield pauses and resumes function = A [OK]
- Confusing yield with return which ends function
- Thinking yield creates variables
- Assuming yield converts function to class method
Solution
Step 1: Recall yield syntax
The correct syntax to yield a value is simplyyield $value;inside the function.Step 2: Check other options
Options B, C, and D use invalid or incorrect syntax for yield in PHP.Final Answer:
yield $value; -> Option DQuick Check:
Simple yield syntax is 'yield $value;' [OK]
- Adding return before yield
- Using arrow (=>) with yield
- Calling yield like a function
function gen() {
yield 1;
yield 2;
yield 3;
}
foreach (gen() as $val) {
echo $val . ' ';
}Solution
Step 1: Understand generator yields
The functiongen()yields values 1, 2, and 3 one by one.Step 2: foreach prints each yielded value
Theforeachloop prints each value followed by a space, so output is '1 2 3 '.Final Answer:
1 2 3 -> Option AQuick Check:
Yielded values printed with spaces = B [OK]
- Expecting concatenated string without spaces
- Thinking yield returns an array
- Assuming syntax error with yield
function numbers() {
yield 1
yield 2;
}
foreach(numbers() as $n) {
echo $n;
}Solution
Step 1: Check yield statements
The first yield statement is missing a semicolon at the end, causing a syntax error.Step 2: Validate other parts
Using yield inside a function and foreach syntax are correct; yield does not require parentheses.Final Answer:
Missing semicolon after first yield statement -> Option BQuick Check:
Each yield needs semicolon [OK]
- Forgetting semicolon after yield
- Thinking yield needs parentheses
- Assuming foreach syntax error
function filterPositive(array $numbers) {
foreach ($numbers as $num) {
if ($num > 0) {
yield $num;
}
}
}
$values = [-2, 0, 3, 5, -1];
foreach (filterPositive($values) as $val) {
echo $val . ',';
}What is the output?
Solution
Step 1: Analyze filtering condition
The function yields only numbers greater than 0, so it skips -2, 0, and -1.Step 2: Identify yielded values
Only 3 and 5 satisfy the condition and are yielded, printed with commas.Final Answer:
3,5, -> Option CQuick Check:
Yield filters positive numbers only = D [OK]
- Including zero or negative numbers
- Thinking yield can't be inside if
- Expecting all values printed
Ready to prove it?
Pass the test and this pattern moves unknown
