Shape Rule
Left-shifted triangle
Row $i prints $i numbers computed as 9 + $i + $j.

The increasing number triangle from 11 prints 11, 12 13, 13 14 15, … — a natural step after the number-star diamond in Program 31. This tutorial covers the 9 + $i + $j formula, nested loops, a live preview, worked PHP examples, edge cases, and complexity.
Left-shifted triangle
Row $i prints $i numbers computed as 9 + $i + $j.
$i = 1..$rows
for ($i = 1; $i <= $rows; $i++) — one growing row per iteration.
1..i
for ($j = 1; $j <= $i; $j++) — prints $i values per row.
9 + $i + $j
Base offset 9 shifts the triangle to start at 11.
3–9 rows
Pick a row count and draw the increasing triangle in the browser.
Complexity
Prints per row = $i — total work scales as n².
A left-shifted increasing number triangle prints values from the formula 9 + $i + $j on each row. With $rows = 5, you get 11, 12 13, 13 14 15, and so on.
In PHP you use nested loops: outer $i = 1..$rows, inner $j = 1..$i, printing (9 + $i + $j) with a trailing space.
It combines nested loops with an arithmetic formula — a step up from Program 31’s modulus diamond.
Formula for each value.
Growing row width.
When base = 9, i=1, j=1.
Follow Program 31; continue to Program 33 ($i + $j - 1) next.
In short: outer loop $i = 1..$rows, inner $j = 1..$i, print 9 + $i + $j with a space, then echo PHP_EOL.
Given $rows = 5, print a left-shifted increasing triangle: for each row $i, print $j = 1..$i values of 9 + $i + $j separated by spaces.
// $rows = 5 (conceptual shape)
// 11
// 12 13
// 13 14 15
// 14 15 16 17
// 15 16 17 18 19 | Item | Type | Description |
|---|---|---|
$rows | int | Triangle height — number of lines to print. |
$i | int | Outer loop — current row; also part of the formula. |
$j | int | Inner loop — column index; runs 1..i per row. |
base | int | Offset in the formula (default 9); first value = base + 2. |
for i from 1 to rows:
for j from 1 to i:
print (9 + $i + $j) + space
print newline | Approach | Idea | Best for |
|---|---|---|
| Fixed formula | 11, 12 13, … | Learning and interviews |
| Custom base | ($baseVal + $i + $j) | Flexible starting number |
| User-input rows | (int) trim(fgets(STDIN)); | Configurable triangle size |
| Goal | Pattern |
|---|---|
| Outer loop | for ($i = 1; $i <= $rows; $i++) |
| Inner loop | for ($j = 1; $j <= $i; $j++) |
| Print value | echo (9 + $i + $j) . " "; |
| End the row | echo PHP_EOL; |
| Custom base | echo ($baseVal + $i + $j) . " "; |
| User input | (int) trim(fgets(STDIN)); |
Same increasing triangle — different ways to control rows and the base offset.
$i = 1..$rowsOne growing row per iteration
9 + $i + $jStarts at 11
$j = 1..$ii values per row
base + 2First printed number
Reach for this pattern when teaching formula-based output, growing inner loops, and arithmetic in nested loops.
Natural follow-up after Program 31 — introduces an arithmetic formula instead of modulus.
Outer/inner bound practice with an immediate visual check.
Combine loops with fgets(STDIN) for a flexible row count.
Compare Program 31 (number-star diamond) and Program 33 ($i + $j - 1) next.
This is a console teaching pattern — not how you build modern app screens.
Key benefit: one small program that locks in nested loops, output sequencing, and O(n²) thinking.
Choose a row count between 3 and 9 and draw the increasing triangle in the browser.
Three complete PHP programs — fixed rows, custom base input, and a smaller trace demo. Click View Output to reveal sample console results.
Print five rows of the increasing triangle with the 9 + $i + $j formula.
$rows = 5Hard-coded row count — ideal for first demos and screenshots.
<?php
for ($i = 1; $i <= 5; $i++) {
for ($j = 1; $j <= $i; $j++) {
echo (9 + $i + $j) . " ";
}
echo PHP_EOL;
} When $i = 1, the inner loop prints 9+1+1 = 11. When $i = 3, it prints 13, 14, 15 — output 13 14 15.
Read row count and base offset with fgets(STDIN) instead of hard-coding 5 and 9.
Read $rows and $baseVal with fgets(STDIN) instead of hard-coding 5 and 9.
<?php
echo "Enter rows: ";
$rows = (int) trim(fgets(STDIN));
echo "Enter base: ";
$baseVal = (int) trim(fgets(STDIN));
if ($rows < 1) return;
for ($i = 1; $i <= $rows; $i++) {
for ($j = 1; $j <= $i; $j++) {
echo ($baseVal + $i + $j) . " ";
}
echo PHP_EOL;
} Same formula core as Example 1; $baseVal replaces hard-coded 9 and $rows replaces 5. Non-numeric input leaves variables unset if you skip is_numeric() checks — always check it in safer labs.
Run with $rows = 3 to trace every row on paper before scaling up.
$rows = 3Same nested-loop formula with a smaller row count for quick tracing.
<?php
$rows = 3;
for ($i = 1; $i <= $rows; $i++) {
for ($j = 1; $j <= $i; $j++) {
echo (9 + $i + $j) . " ";
}
echo PHP_EOL;
} Only $rows changes from 5 to 3 — the nested-loop formula stays identical. Trace $i = 1, 2, 3 on paper to see how each row adds one more value.
Set $rows = 5; and use fgets(STDIN) when reading input. Set loop variables $i, $j.
for ($i = 1; $i <= $rows; $i++) — one growing row per iteration.
for ($j = 1; $j <= $i; $j++) — prints $i values per row.
echo (9 + $i + $j) . " " — each value from the arithmetic formula.
echo PHP_EOL ends the row after the inner loop finishes.
Prints per row = $i — O(n²) time, O(1) extra memory.
$rows = 5Trace each outer-loop value of $i, inner-loop range, values printed, and full row output.
$i | Inner range ($j) | Values (9+i+j) | Row output |
|---|---|---|---|
1 | 1 | 11 | 11 |
2 | 1, 2 | 12, 13 | 12 13 |
3 | 1, 2, 3 | 13, 14, 15 | 13 14 15 |
4 | 1..4 | 14, 15, 16, 17 | 14 15 16 17 |
5 | 1..5 | 15, 16, 17, 18, 19 | 15 16 17 18 19 |
Prints per row = $i — total prints = n(n+1)/2 for n rows.
Where this tiny pattern (and its loop structure) shows up beyond the homework prompt.
Clearest visual proof that outer and inner bounds interact.
Example: change inner bound to $j <= $rows and watch every row print the same width.
Foundation for formula-based triangles, custom bases, and left-shifted sequences.
Example: continue to Program 33 for the $i + $j - 1 variant starting at 1.
Practice echo.print vs row newline without complex math.
Example: put echo PHP_EOL inside the inner loop by mistake.
Add spaces between digits once the two-loop structure works.
Example: use echo j) between digits for wider spacing.
Triangular totals make O(n²) concrete for beginners.
Example: count printed numbers for $rows = 5 — total is 1+2+3+4+5 = 15.
Pair the pattern with is_numeric(trim($line)) checks and positive-row checks.
Example: reject max <= 0 and re-prompt.
Pro Tip: when an interviewer asks for patterns, explain the outer/inner roles first — then write the loops. The story matters as much as the code.
Why this pattern earns a permanent spot in beginner PHP courses.
Wrong bounds show up immediately as a broken staircase.
Only loops and console output — no arrays or math libraries.
Invert, center, hollow, or change the fill character with small edits.
Streaming output needs no storage beyond loop counters.
Pro Tip: trace $i and $j on paper for $rows = 3 before coding — watch how each row prints $i values starting at 9 + $i + 1.
Small habits that keep number-pattern code clean.
Inner bound must be $j <= $i — row $i prints exactly $i numbers.
trim(fgets(STDIN))Call is_numeric(trim($line)) so bad input does not leave variables uninitialized.
Only call echo PHP_EOL after the inner loop finishes the row.
Trace the formula for each ($i, $j) pair before coding the loops.
Trace $i = 1..3 on paper before coding the full $rows = 5 demo.
Pro Tip: if the output is a vertical list of single digits per line, you almost certainly put echo PHP_EOL inside the inner loop.
Mistakes that commonly break increasing number triangles.
Each digit lands on its own line — you get a column, not a triangle.
→ Use echo (9 + $i + $j) . " "; echo PHP_EOL only after the inner loop.
Using $i + $j or 10 + $i + $j shifts every value — the triangle no longer starts at 11.
→ Keep 9 + $i + $j (or $baseVal + $i + $j with $baseVal = 9).
$j <= $rows prints a rectangle — every row has the same width.
→ Keep for ($j = 1; $j <= $i; $j++) so row $i prints $i values.
Printing numbers without a space makes multi-digit values run together on wider rows.
→ Append a space after each number: echo (9 + $i + $j) . " ".
Letters or empty input leave variables uninitialized.
→ Call is_numeric(trim($line)) and re-prompt on failure.
Check these inputs before calling the solution done.
Output is just 11 — one value, one row.
Outer loop never runs — print nothing or show a message.
$rows < 0Treat as invalid; re-prompt instead of silent empty output.
Two rows: 11 and 12 13.
Unchecked CLI input leaves variables unset — call is_numeric(trim($line)) first.
Total prints = n(n+1)/2 — grows quadratically with row count.
Try these variations to lock in the pattern.
9 with a user-entered $baseVal$i + $j - 1 instead of 9 + $i + $jis_numeric(trim($line)) until $rows >= 19 + $i + $j. Inner loop runs $j = 1..$i — row $i prints $i numbers.echo (9 + $i + $j) . " " stays on the line; echo PHP_EOL advances — mix them carefully.$rows > 0 for interactive programs; $rows = 1 prints a single 11.9 to any base to shift the whole triangle — compare with Program 33 where the formula is $i + $j - 1.Quick Takeaway: outer loop $i = 1..$rows, inner $j = 1..$i, print 9 + $i + $j, then echo PHP_EOL.
| Program | Time | Extra space |
|---|---|---|
| Nested loops (Examples 1–3) | O(n²) | O(1) |
| Smaller demo (Example 3) | O(n²) | O(1) |
The increasing number triangle from 11 is a compact lesson in formula-based nested loops: compute each value with 9 + $i + $j, grow the inner bound to $i, and end each row with echo PHP_EOL. Master the fixed-$rows version, then try user input and a smaller trace demo.
Practice the three examples above, then continue to Program 33 for the $i + $j - 1 variant starting at 1.
Inner bound must be $j <= $i — validate $rows when reading from the console.
for ($i = 1; $i <= $rows; $i++) in the outer loopfor ($j = 1; $j <= $i; $j++) prints $i valuesecho (9 + $i + $j) . " "is_numeric(trim($line)) before using $rowsecho PHP_EOL inside the inner loop$j <= $rows in the inner loop (prints a rectangle)$rows = 1 edge casePrint the pattern the beginner-friendly way.
9 + $i + $j
Definition$j = 1..$i
CodeStarts at 11
Codeecho PHP_EOL after $j loop
ShapeO(n²) time
AnalysisEach printed value is computed as 9 + $i + $j. Row $i = 1 prints 11; row $i = 2 prints 12 and 13 — a left-shifted increasing triangle.
Move on to the increasing number triangle starting from 1 ($i + $j - 1) in the PHP number-pattern series.
12 people found this page helpful