A shrinking repeating number pattern prints digit i repeated rows - i + 1 times, counting i up from 1.
Remember
Rule: for i = 1..n, print i exactly (n - i + 1) times
11111
2222
333
44
5 ← 5 rows
In PHP you solve it with two nested for loops: the outer loop picks the digit, the inner loop repeats it with echo $i, then echo PHP_EOL ends the row. Program 9 grows instead (1, 22, 333…); Program 11 inverts while counting down (55555, 4444, 333…).
Approach
How to Solve It
Outer loop counts up from 1 to $rows. Inner loop repeats digit $i exactly $rows - $i + 1 times. End each row with echo PHP_EOL.
Method
Idea
Best for
Nested loops
Outer picks digit 1..n; inner runs i..n so the row shrinks
Learning, interviews, exams
str_repeat
Build each full row in one call
Leaner demos once loops click
Pseudocode
Pseudocode
for i from 1 to rows:
for j from i to rows:
print i (no newline)
print newline
1. Count still matters.$rows - $i + 1 is the same repeat length the inner loop used.
2. Same shape. Identical output to Example 1 — keep the nested-loop version for exams that expect two loops.
3. Cast to string.str_repeat needs a string — (string) $i keeps the digit clear.
Edge Cases & Pitfalls
Check these before calling the solution done.
wrong twin
for ($j = 1; $j <= $i; $j++)
That is Program 9 (1, 22, 333). Keep the inner start at $i so the row shrinks.
PHP_EOL inside
echo PHP_EOL inside the inner loop
That puts each digit on its own line. Print repeats without a newline; call echo PHP_EOL only after the row finishes.
count down
for ($i = $rows; $i >= 1; $i--) with echo $i × $i
That is Program 11 (55555, 4444, 333). Keep counting up for this pattern.
rows = 1
Single digit
Output is just 1 — a good sanity check.
rows ≤ 0
Empty output
The outer loop never runs. Validate and prompt again for clearer UX.
multi-digit
$rows > 9
echo 10 prints two characters. Labs usually stick to 1–9 for a clean single-digit look.
Analysis
Time and Space Complexity
Program
Time
Extra space
Nested loops (Examples 1–2)
O(n²)
O(1)
str_repeat shortcut (Example 3)
O(n²)
O(1) beyond the row string
There are n rows printing n+(n-1)+…+1 digits, so total work is n(n+1)/2.
Remember
Key Takeaways
Rule: for $i = 1..n, print digit $i exactly n - i + 1 times.
Inner bound:$j from $i to $rows shrinks the row as the digit rises.
echo vs PHP_EOL: repeats stay on the line; echo PHP_EOL advances after each row.
Next step: Program 13 mixes ascending and descending digits across alternating rows.
One line: for each digit from 1 to n, print it n-i+1 times with echo, then echo PHP_EOL.
Frequently Asked Questions
The inner loop runs from j = i to rows. As i increases (1, 2, 3, …), the inner loop runs fewer times, so each row prints fewer copies of the row digit.
On the first row, i = 1 and the inner loop runs from 1 to rows, so it prints 1 exactly rows times — five 1s when rows = 5.
echo stays on the same line. echo PHP_EOL ends the current line. Repeated digits use echo $i; the row break uses echo PHP_EOL after the inner loop.
Program 11 counts the outer loop down and repeats digit i exactly i times (55555, 4444, 333, 22, 1). Program 12 counts up and uses for ($j = $i; $j <= $rows; $j++) so digit i repeats rows - i + 1 times (11111, 2222, 333, 44, 5).
Program 10 counts the digit down while repeats grow (5, 44, 333). Program 12 counts the digit up while the row still shrinks (11111, 2222, 333).
O(n²) where n is the number of rows. Total echo calls equal n+(n-1)+…+1 = n(n+1)/2.
Yes. echo str_repeat((string)$i, $rows - $i + 1) . PHP_EOL prints a full row in one call. Nested loops are better for learning; str_repeat is a handy shortcut once the bounds make sense.
Use trim(fgets(STDIN)) and check is_numeric($input) before casting to int so bad input does not produce unexpected results.
The outer loop never runs, so nothing is printed. Validate and prompt again if you want a clear user message.
🤔
Did you know?
Row digit i repeats rows − i + 1 times. The outer loop counts up from 1, while the inner loop runs from i to rows, so each row shrinks — still O(n²) total prints.