Shape Rule
A..end letter on row i
Row 1 prints A, row 2 prints AB, up to rows letters on the last line.

The alphabet right-angled triangle is a classic first console letter pattern: nested loops, char iteration from A, and a clear visual result. This tutorial covers the shape rule, loop structure, a live preview, algorithm steps, worked PHP examples, edge cases, and complexity.
A..end letter on row i
Row 1 prints A, row 2 prints AB, up to rows letters on the last line.
Rows
for ($i = 'A'; $i <= $last; $i++) picks the end letter for each row.
Letters
for ($j = 'A'; $j <= $i; $j++) prints letters from A through the end letter.
Same line / next line
Letters use echo; end each row with echo PHP_EOL;.
1–26 rows
Pick a row count and draw the alphabet triangle instantly in the browser.
Complexity
Total letters = n(n+1)/2; extra memory stays O(1).
An alphabet right-angled triangle pattern grows by one letter on each new line. With the right angle on the left, the console output looks like a staircase of letters.
In PHP you usually solve it with two nested for loops: the outer loop picks the row, the inner loop prints letters from A on that row, then echo PHP_EOL; moves to the next line.
It is the standard first pattern exercise in PHP courses. Once nested loops and echo/PHP_EOL click, inverted triangles, pyramids, and more letter patterns become much easier.
On row i, print letters from A through the i-th letter.
Outer controls rows; inner prints characters.
echo $j; in the inner loop; echo PHP_EOL; after.
Gateway to inverted, pyramid, and hollow patterns.
In short: for each row i from 1 to rows, print letters from A with echo, then call echo PHP_EOL;.
Given a positive integer rows, print a left-aligned alphabet right-angled triangle of letters with rows lines.
// First 5 rows (conceptual shape)
// A
// AB
// ABC
// ABCD
// ABCDE | Item | Type | Description |
|---|---|---|
rows | int | Number of triangle lines to print (typically ≥ 1). |
| Printed output | text | Left-aligned rows of letters; row i has i letters from A. |
for i from 1 to rows:
for j from 1 to i:
print next letter from A (no newline)
print newline | Approach | Idea | Best for |
|---|---|---|
| Nested loops | Outer rows + inner letters | Learning and interviews |
substr($letters, 0, $i) | Build a whole row in one call | Shorter production-style demos |
| Goal | Pattern |
|---|---|
| Walk each row | for ($i = 'A'; $i <= $last; $i++) |
Print A..end letters | for ($j = 'A'; $j <= $i; $j++) echo $j; |
| End the row | echo PHP_EOL; |
| One-line row shortcut | echo substr($letters, 0, $i) . PHP_EOL; |
| Invert later | Shrink end letter each row (see Program 2) |
Same triangle — different ways to emit characters.
same linePrints a letter without moving to the next line
new lineEnds the current row after all letters are printed
whole rowBuilds letters A..end at once — skip the inner loop
loops firstMaster nested loops before the string shortcut
Reach for this triangle when teaching or testing nested-loop basics.
Most PHP alphabet pattern series start here before inverted and pyramid letter patterns.
Outer/inner bound practice with an immediate visual check.
Combine loops with fgets(STDIN) for a flexible row count.
Invert, center, hollow, or try lowercase 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 1 and 20 and draw the right-angled triangle in the browser.
Three complete PHP programs — fixed row count, CLI input, and a substr shortcut. Click View Output to reveal sample console results.
Print five rows with classic nested loops.
rows = 5Hard-coded height — ideal for first demos and screenshots.
<?php
for ($i = 'A'; $i <= 'E'; $i++) {
for ($j = 'A'; $j <= $i; $j++) {
echo $j;
}
echo PHP_EOL;
} When the end letter is A, the inner loop prints A. When it is B, the loop prints AB, and so on through E. echo PHP_EOL; after the inner loop starts the next row.
Let the user choose the height at runtime.
Read the row count with fgets(STDIN) and cast to int (check is_numeric() in real apps).
<?php
echo "Enter the number of rows: ";
$rows = (int) trim(fgets(STDIN));
$top = chr(ord('A') + $rows - 1);
for ($i = 'A'; $i <= $top; $i++) {
for ($j = 'A'; $j <= $i; $j++) {
echo $j;
}
echo PHP_EOL;
} Same char-loop core as Example 1; only the source of rows changes. Prefer clamping to 26 for A–Z demos. Non-numeric input can cast to 0 with a bare (int) cast — check is_numeric() for safer labs.
Same shape without an explicit inner letter loop.
substr(..., 0, $i)Slice A–Z for each row length, then print it.
<?php
$rows = 5;
$letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for ($i = 1; $i <= $rows; $i++) {
echo substr($letters, 0, $i) . PHP_EOL;
} substr($letters, 0, $i) returns the first i letters of the alphabet. Great once you understand the nested-loop idea; keep the two-loop version for exams that ask you to show both bounds.
Use fgets(STDIN) when reading input. Set rows (fixed or from CLI).
for ($i = 'A'; $i <= $last; $i++) selects the end letter for the current line.
for ($j = 'A'; $j <= $i; $j++) prints each letter from A through i.
echo PHP_EOL; ends the row so the next outer iteration starts fresh.
Total letters: 1+2+…+n = n(n+1)/2 — O(n²) time, O(1) extra memory.
rows = 4Trace each outer-loop end letter and see what the inner loop prints from A.
| End letter | Inner j range | Printed row | Letters this row |
|---|---|---|---|
'A' | A..A | A | 1 |
'B' | A..B | AB | 2 |
'C' | A..C | ABC | 3 |
'D' | A..D | ABCD | 4 |
Total letter prints: 1 + 2 + 3 + 4 = 10 = 4×5/2.
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 j <= i and watch the shape change.
Foundation for inverted, pyramid, diamond, and hollow variants.
Example: Program 2 only reverses the outer loop.
Practice character loops and echo/PHP_EOL without complex math.
Example: forget to reset the inner loop to A each row.
Swap to lowercase or digits once the letter loop works.
Example: print lowercase a..z once uppercase clicks.
Triangular totals make O(n²) concrete for beginners.
Example: count printed letters for n = 10 → 55.
Pair the pattern with is_numeric() and positive-row checks.
Example: reject rows <= 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: learn the nested-loop version first; treat substr($letters, 0, $i) as a polish shortcut afterward.
Small habits that keep alphabet-pattern code clean.
Use rows (or n) and keep i/j for row/column — or rename to row/col.
is_numeric()Avoid crashes when the user types letters instead of a number.
Only call echo PHP_EOL; after the inner loop finishes the row.
1..rows with j <= i matches “row i has i letters from A” naturally.
Trace rows = 3 on paper before coding larger demos.
Pro Tip: if the output is a vertical list of single letters, you almost certainly put echo PHP_EOL; inside the inner loop.
Mistakes that commonly break right-angled alphabet patterns.
Each letter lands on its own line — you get a column, not a triangle.
→ Use echo for letters; echo PHP_EOL; only after the inner loop.
j <= rows prints a rectangle; j < i drops a letter each row.
→ For this shape, keep j <= i.
Omitting echo PHP_EOL; glues every letter onto one endless line.
→ Always end the row after the inner loop.
(int) CastLetters or empty input can silently become 0.
→ Check is_numeric() and re-prompt on failure.
Switching to i = 0 without adjusting the inner bound prints an empty first row or wrong counts.
→ If 0-based, print i + 1 letters (e.g. j <= i + 1).
Check these inputs before calling the solution done.
Output is just A on one line.
Outer loop never runs — print nothing or show a message.
rows < 0Treat as invalid; re-prompt instead of silent empty output.
Output grows as n²/2 characters — fine for labs, noisy for huge n.
Validate with is_numeric() before casting.
Same loops work with #, digits, or letters.
Try these variations to lock in the pattern.
rows down to 1a..z the same wayis_numeric() until rows >= 1n(n+1)/2 — hence O(n²) time.echo stays on the line; PHP_EOL advances — mix them carefully.rows > 0 for interactive programs; rows = 1 should print a single A.Quick Takeaway: outer loop picks the row, inner loop prints A..end, then break the line — that is the whole pattern.
| Program | Time | Extra space |
|---|---|---|
| Nested loops (Examples 1–2) | O(rows²) | O(1) |
substr($letters, 0, $i) (Example 3) | O(rows²) | O(rows) per row string (temporary) |
The alphabet right-angled triangle is a small nested-loop exercise with lasting payoff: row/column thinking, echo vs PHP_EOL, and O(n²) intuition. Master the classic two-loop version, then optionally shorten rows with substr($letters, 0, $i).
Practice the three examples above, then continue to the inverted triangle for reverse outer-loop practice.
Row i has i letters — keep echo for letters and PHP_EOL for the break, and validate row counts when reading input.
echo $j; for letters and echo PHP_EOL; after each rowrows ≥ 1 for interactive programsis_numeric() before casting to intecho PHP_EOL; inside the inner letter loopA each rowrows = 1 edge casePrint the letter triangle the beginner-friendly way.
Row i has A..end letters
DefinitionControls each row
CodePrints A..end with print
CodeEnds each row
I/OO(n²) time
AnalysisRow i prints letters from A through the i-th letter (A, AB, ABC, …). Total letters for n rows is the triangular number n(n+1)/2 — the same count that makes this pattern O(n²).
Shrink the end letter each row for an upside-down alphabet triangle.
12 people found this page helpful