PHP Repeating Alphabet Triangle Pattern

Beginner
7 min read
Updated: Sep 2026
3 programs
Live preview

What Is This Pattern?

A repeating alphabet triangle grows by one character each row, but every character on that row is the same letter — the letter advances with the row.

Remember
Rule: for letter i from A to last,
      print i with growing width 1, 2, 3, …

A
BB
CCC
DDDD
EEEEE     ← 5 rows

Unlike Program 1 (A, AB, ABC), letters do not step across the row — you print the outer loop letter inside the inner loop. The reverse twin is Program 10 (E, DD, CCC, …).

How to Solve It

Two ways to emit the same shape — start with nested letter loops, then optionally shorten with str_repeat.

MethodIdeaBest for
Nested letter loopsOuter = letter; inner = growing width; echo outer letterLearning, interviews, exams
str_repeat($ch, $n)Build a whole repeated-letter row in one callShorter demos once loops click

Pseudocode

Pseudocode
for i from 'A' to lastLetter:
    for j from 'A' to i:
        print i (no newline)
    print newline

Cheat sheet

GoalPattern
Advance letterfor ($i = 'A'; $i <= $last; $i++)
Grow widthfor ($j = 'A'; $j <= $i; $j++)
Uniform rowecho $i; — print $i, not $j
End the rowecho PHP_EOL;
Letter from row index$ch = chr(ord('A') + $row - 1);
One-line shortcutecho str_repeat($ch, $row) . PHP_EOL;
Reverse twinProgram 10 (E, DD, CCC, …)

Printing Letters vs Starting a New Line

APIEffectUse for
echo $chStays on the same lineEach letter on the row
echo PHP_EOLEnds the current lineAfter the inner loop finishes a row

Print letters without a newline, then end the row once.

Live Preview

Change the row count and the repeating triangle updates instantly — including the triangular letter total.

Whole numbers from 1 to 10. Tap a chip or type a value — the preview redraws as you go.

Live result 5 rows · last E · 15 letters
A
BB
CCC
DDDD
EEEEE

Worked Walkthrough — rows = 4

Trace each outer-loop letter as $i advances from 'A' to 'D'.

Letter $iInner runsPrinted rowRepeats
'A'1A1
'B'2BB2
'C'3CCC3
'D'4DDDD4

Total letter prints: 1 + 2 + 3 + 4 = 10 = 4×5/2 — same triangular count as Program 1.

PHP Programs

Three complete programs: fixed last letter, CLI row-count input, and a str_repeat shortcut. Use View Output to reveal sample results.

Example 1 — Fixed from 'A' to 'E'

Hard-coded last letter — outer loop picks the letter; inner loop only controls the repeat count.

PHP
<?php
for ($i = 'A'; $i <= 'E'; $i++) {
    for ($j = 'A'; $j <= $i; $j++) {
        echo $i;
    }
    echo PHP_EOL;
}
?>

How It Works

1. Outer loop picks the row letter. $i runs from 'A' to 'E' — one letter per row.

2. Inner loop only counts. $j runs from 'A' to $i, so the width grows 1, 2, 3, …

3. Print $i, not $j. That keeps every character on the row the same. Printing $j would rebuild Program 1.

When $i = 'C' the inner loop runs three times and you get CCC.

Example 2 — Row Count Input

Compute the row letter from the row number. Prefer is_numeric in real apps.

PHP
<?php
echo "Enter the number of rows: ";
$rows = (int) trim(fgets(STDIN));

for ($row = 1; $row <= $rows; $row++) {
    $ch = chr(ord('A') + $row - 1);
    for ($col = 1; $col <= $row; $col++) {
        echo $ch;
    }
    echo PHP_EOL;
}
?>

How It Works

1. Prompt and read. Ask for a row count with fgets(STDIN), then cast to int.

2. Map row index to a letter. $ch = chr(ord('A') + $row - 1) — for $row = 3, $ch is 'C'.

3. Repeat $ch exactly $row times. Same uniform-row idea as Example 1, expressed with integer bounds.

4. Safer input tip. Prefer is_numeric and stay within A–Z:

Safer input
$input = trim(fgets(STDIN));
if (!is_numeric($input)) {
    echo "Enter a row count from 1 to 26." . PHP_EOL;
    exit;
}
$rows = (int) $input;
if ($rows < 1 || $rows > 26) {
    echo "Enter a row count from 1 to 26." . PHP_EOL;
    exit;
}

Example 3 — str_repeat($ch, $row)

Build each repeated-letter row in one call — same shape, no explicit inner letter loop.

PHP
<?php
$rows = 5;

for ($row = 1; $row <= $rows; $row++) {
    $ch = chr(ord('A') + $row - 1);
    echo str_repeat($ch, $row) . PHP_EOL;
}
?>

How It Works

1. One outer loop. Still walk $row from 1 to $rows and map it to a letter.

2. Build the row. str_repeat($ch, $row) creates a string of length $row filled with $ch.

3. Print and advance. Append PHP_EOL to print that string and end the 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.

echo $j

Program 1 by mistake

If you print $j instead of $i, letters step across the row (A, AB, ABC…). Always print the outer-loop letter.

PHP_EOL early

Column of letters

If echo PHP_EOL is inside the inner loop, each letter lands on its own line. Use echo $i for letters; end the row only after the inner loop.

Wrong width

Rectangle, not triangle

Inner bound must grow with the row ($j <= $i or $col <= $row). A fixed inner bound prints a filled rectangle.

rows = 1

Single A

Output is just A on one line — a good sanity check.

rows > 26

Beyond Z

Cap or reject — the row letter leaves the alphabet. Keep $rows in 1…26 for A–Z demos.

Bad input

Use is_numeric

Bare (int) trim(fgets(STDIN)) turns letters into 0. Prefer is_numeric and clamp to 1…26.

Time and Space Complexity

ProgramTimeExtra space
Nested loops (Examples 1–2)O(n²)O(1)
str_repeat (Example 3)O(n²)O(n) per temporary row string

Total letters printed = 1 + 2 + … + n = n(n+1)/2, which is still quadratic in n.

Key Takeaways

  • Rule: one letter per row; width grows 1, 2, 3, …
  • Print the outer letter: the inner loop only counts — echo $i, not $j.
  • Break the row: call echo PHP_EOL only after the inner loop.
  • Complexity: O(n²) time; O(1) extra space for nested loops.

One line: for each letter $i, echo $i a growing number of times, then echo PHP_EOL.

Frequently Asked Questions

Because the inner loop prints the outer-loop character ($i) every time. The inner counter only controls how many times to print, not which character to print.
Then letters would change across the row (A, AB, ABC…), which is Program 1 — not a repeating-letter triangle.
On the third row the row letter is C, and the inner loop runs three times, printing C each time.
Program 1 prints stepping letters across each row (A, AB, ABC). This pattern keeps one letter per row and only grows the repeat count (A, BB, CCC).
Program 10 uses the same growing widths but letters count downward (E, DD, CCC…). This pattern counts upward (A, BB, CCC…).
echo stays on the same line. echo PHP_EOL ends the current line. Letters use echo; the row break uses echo PHP_EOL after the inner loop.
O(n²) for n rows, because total printed characters are n(n+1)/2.
Yes. echo str_repeat($ch, $row) . PHP_EOL prints a full repeated-letter row in one call. Nested loops are better for learning; str_repeat is a handy shortcut later.

Did you know?

Each row prints the same letter repeatedly: row 1 prints A once, row 2 prints B twice, row 3 prints C three times. Print the outer loop letter inside the inner loop so the row stays uniform. The reverse twin is Program 10.

Next: Reverse Repeating Triangle

Same growing widths, letters counting down — E, DD, CCC, BBBB…

Program 10 tutorial →

About the author

Mari Selvan M P
Mari Selvan M P 🔗

Developer, cloud engineer, and technical writer

  • Experience 12 years building web and cloud systems
  • Focus Full Stack Development, AWS, and Developer Education

I write practical tutorials so students and working developers can learn by doing—from databases and APIs to deployment on AWS.

12 people found this page helpful