An alphabet right-angled triangle prints a left-aligned staircase of letters: row i is the first i letters of the alphabet.
Remember
Rule: on row i, print A through the i-th letter
A
AB
ABC
ABCD
ABCDE ← 5 rows
In PHP you solve it with two nested for loops: the outer loop picks the end letter, the inner loop restarts at A and echos each character, then echo PHP_EOL moves to the next line. Once this clicks, reverse triangles and other letter patterns become much easier.
Approach
How to Solve It
Two ways to emit the same shape — start with nested letter loops, then optionally shorten with substr.
Method
Idea
Best for
Nested letter loops
Outer = end letter; inner = A..end
Learning, interviews, exams
substr($letters, 0, $i)
Take the first $i letters of A–Z in one call
Shorter demos once loops click
Pseudocode
Pseudocode
for $end from 'A' to lastLetter:
for $ch from 'A' to $end:
echo $ch
echo PHP_EOL
1. Outer loop picks the end letter.$i runs from 'A' to 'E' — one row per end letter.
2. Inner loop restarts at A. For each $i, $j runs from 'A' to $i, so the row is A..$i.
3. Print letters, then break the line.echo $j stays on the row; echo PHP_EOL after the inner loop starts the next row.
When $i = 'A' you get A; when $i = 'B' you get AB; up through ABCDE.
Example 2 — User Input Version
Read the row count from the CLI. Prefer validating with is_numeric and clamping to 26 (shown in the tip below).
PHP
<?php
echo "Enter the number of rows: ";
$rows = (int) trim(fgets(STDIN));
$last = chr(ord('A') + $rows - 1);
for ($i = 'A'; $i <= $last; $i++) {
for ($j = 'A'; $j <= $i; $j++) {
echo $j;
}
echo PHP_EOL;
}
Output (when user enters 4)
Enter the number of rows: 4
A
AB
ABC
ABCD
How It Works
1. Prompt and read. Ask for a row count, then cast the trimmed line to an int.
2. Map rows to an end letter.$last = chr(ord('A') + $rows - 1) — for $rows = 4, $last is 'D'.
3. Same nested-loop core. Only the source of $last changes — the print logic matches Example 1.
4. Safer input tip. Prefer:
Safer input
$raw = trim(fgets(STDIN));
if (!is_numeric($raw)) {
echo "Enter a whole number from 1 to 26." . PHP_EOL;
exit;
}
$rows = (int) $raw;
if ($rows < 1 || $rows > 26) {
echo "Enter a whole number from 1 to 26." . PHP_EOL;
exit;
}
Example 3 — substr($letters, 0, $i)
Build each row in one call — same shape, no explicit inner letter loop.
2. Slice the alphabet.substr($letters, 0, $i) returns the first $i characters (A, AB, …).
3. Print and advance. Append PHP_EOL so each slice lands on its own line.
Learn the two-loop version first (Examples 1–2) so you can explain both bounds; treat this as a polish shortcut afterward.
Edge Cases & Pitfalls
Check these before calling the solution done.
PHP_EOL inside
Column of letters
If echo PHP_EOL sits inside the inner loop, each letter lands on its own line. Use echo for letters; break the row only after the inner loop.
Wrong bound
Rectangle / wrong length
Inner range must be 'A' through $i. A fixed end always prints the same width.
$rows = 1
Single A
Output is just A on one line — a good sanity check.
$rows > 26
Past Z
chr(ord('A') + $rows - 1) leaves A–Z when $rows > 26. Clamp or reject in interactive programs.
Char ++ past Z
Odd loop stop
PHP letter increment past 'Z' becomes multi-character strings. Cap loops at 26 for alphabet demos.
Bad input
Use is_numeric
Bare (int) fgets(STDIN) turns letters into 0 — validate before the outer loop.
Analysis
Time and Space Complexity
Program
Time
Extra space
Nested loops (Examples 1–2)
O(rows²)
O(1)
substr (Example 3)
O(rows²)
O(rows) per temporary row string
Total letters = 1 + 2 + … + n = n(n + 1)/2 — still quadratic in n.
Remember
Key Takeaways
Rule: row with end letter $i prints A through $i.
Two loops: outer = end letter; inner restarts at A.
Break the row: call echo PHP_EOL only after the inner loop.
Complexity:O(n²) time from the triangular letter count; O(1) extra space for nested loops.
One line: for each end letter $i from 'A' to the last letter, print A through $i, then echo PHP_EOL.
Frequently Asked Questions
The outer loop picks the last letter on each row. The inner loop always restarts at A and prints up through that last letter, so row 1 is A, row 2 is AB, row 3 is ABC, and so on.
Each row is a fresh sequence from A to the current end letter. If you kept advancing a single char across rows, you would get a different pattern (not this right-angled alphabet triangle).
echo sends output without adding a line break. echo PHP_EOL ends the current line with a portable newline. Letters use echo; the row break uses echo PHP_EOL after the inner loop.
Start each row at the top letter and count down — for example E, ED, EDC. See Alphabet Pattern Program 2.
O(n²) where n is the number of rows. Total echo calls equal 1+2+…+n = n(n+1)/2.
Yes. Keep a string of A–Z and print substr($letters, 0, $i) for row length i. Nested letter loops are better for learning; substr is a handy shortcut later.
Use trim(fgets(STDIN)) and check is_numeric($input) before casting to int, then clamp rows between 1 and 26 so bad input does not walk past Z.
Char math can produce characters beyond Z. Clamp to 26 for A–Z demos, or define a clear wrap/error policy.
🤔
Did you know?
Row 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²).