PHP Sequential Alphabet Triangle Pattern

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

What Is This Pattern?

A sequential alphabet triangle grows like a right-angled star triangle, but letters keep advancing across the whole figure — they do not reset to A on each row.

Remember
Rule: one running char $k; echo then $k++
      Row $i prints $i letters

A
B C
D E F
G H I J
K L M N O     ← 5 rows (15 letters, A–O)

Contrast with Program 1, where every row starts over at A. Here a single $k lives outside the outer loop and only moves forward.

How to Solve It

Keep one letter cursor, print it on each cell, then advance — optionally separate letters with spaces.

MethodIdeaBest for
Spaced rowsecho $k, optional space, then $k++Readable demos, interviews
Compact rowsSame $k++ logic without spacesDenser output once the idea clicks

Pseudocode

Pseudocode
$k = 'A'
for $i from 1 to $rows:
    for $j from 1 to $i:
        echo $k (no newline)
        if $j < $i: echo " " (no newline)
        $k = next letter
    echo PHP_EOL

Cheat sheet

GoalPattern
Start the cursor$k = 'A'; before the outer loop
Walk each rowfor ($i = 1; $i <= $rows; $i++)
Print $i lettersfor ($j = 1; $j <= $i; $j++)
Advance foreverecho $k; $k++;
Space between lettersif ($j < $i) echo " ";
End the rowecho PHP_EOL;
A–Z-safe height$rows*($rows+1)/2 ≤ 26 → max 6 rows

Printing Letters vs Starting a New Line

APIEffectUse for
echoStays on the same lineEach letter and each space
echo PHP_EOLEnds the current lineAfter the inner loop

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

Live Preview

Change the row count and the sequential triangle updates instantly — including letter totals and the last letter used.

Whole numbers from 1 to 7. Six rows stay in A–Z (21 letters); seven needs 28 and continues past Z.

Live result 5 rows · A–O · 15 letters
A
B C
D E F
G H I J
K L M N O

Worked Walkthrough — $rows = 4

Trace each outer value of $i and watch $k keep advancing — never reset.

$iLetters printedPrinted row$k after row
1AAB
2B, CB CD
3D, E, FD E FG
4G…JG H I JK

Total letters: 1 + 2 + 3 + 4 = 10 = 4×5/2. That triangular sum is why time is O(n²).

PHP Programs

Three complete programs: fixed height with spaces, CLI input, and a compact no-space variant. Use View Output to reveal sample results.

Example 1 — Fixed $rows = 5

Hard-coded height with spaces between letters — ideal for first demos.

PHP
<?php
$k = 'A';

for ($i = 1; $i <= 5; $i++) {
    for ($j = 1; $j <= $i; $j++) {
        echo $k;
        if ($j < $i) echo " ";
        $k++;
    }
    echo PHP_EOL;
}
?>

How It Works

1. Start the cursor. $k = 'A' before any loop — it must outlive each row.

2. Outer loop picks the row width. Row $i prints exactly $i letters.

3. Inner loop prints and advances. echo $k, optional space, then $k++ so the next cell gets the next letter.

4. Break the line. echo PHP_EOL; after the inner loop; $k keeps its value for the next row.

Example 2 — User Input Version

Read the height from CLI. Prefer is_numeric and clamp for A–Z (shown in the tip below).

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

$k = 'A';
for ($i = 1; $i <= $rows; $i++) {
    for ($j = 1; $j <= $i; $j++) {
        echo $k;
        if ($j < $i) echo " ";
        $k++;
    }
    echo PHP_EOL;
}
?>

How It Works

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

2. Same running-$k core. Only the outer bound changes — the echo and advance logic matches Example 1.

3. Safer input tip. Prefer is_numeric and keep the letter count in A–Z when you want that limit:

Safer input
$input = trim(fgets(STDIN));
if (!is_numeric($input)) {
    echo "Enter rows so letters stay in A–Z (max 6)." . PHP_EOL;
    exit;
}
$rows = (int) $input;
if ($rows < 1 || $rows * ($rows + 1) / 2 > 26) {
    echo "Enter rows so letters stay in A–Z (max 6)." . PHP_EOL;
    exit;
}

Example 3 — No Spaces

Same sequence without spaces between letters — denser formatting only.

PHP
<?php
$k = 'A';

for ($i = 1; $i <= 5; $i++) {
    for ($j = 1; $j <= $i; $j++) {
        echo $k;
        $k++;
    }
    echo PHP_EOL;
}
?>

How It Works

1. Same cursor. $k still starts at 'A' and advances after every letter.

2. Drop the spacer. Remove the if ($j < $i) echo " " line — the sequence is unchanged.

3. Same row break. echo PHP_EOL; still ends each row after the inner loop.

Edge Cases & Pitfalls

Check these before calling the solution done.

Reset $k each row

Program 1 by mistake

If you set $k = 'A' inside the outer loop, every row restarts at A. Keep $k outside.

$k++ once per row

Repeated letters

Increment inside the inner loop after each print. Advancing only once per row repeats the same letter across wide rows.

PHP_EOL inside

Column of letters

If echo PHP_EOL sits inside the inner loop, each letter lands on its own line. Call it only after the inner loop.

Past Z

Cap the height

Seven rows need 28 letters. Cap so n(n+1)/2 ≤ 26, or stop when $k > 'Z'.

$rows = 1

Single A

Output is just A — a good sanity check.

Bad input

Check is_numeric

Casting non-numeric input to int becomes 0. Prefer is_numeric and keep the triangular letter count in range.

Time and Space Complexity

ProgramTimeExtra space
Spaced / compact loopsO($rows²)O(1)

Total letters printed = 1 + 2 + … + n = n(n+1)/2, which is still quadratic in n. Spaces add only a linear factor of the same order.

Key Takeaways

  • One cursor: declare $k before the outer loop and never reset it per row.
  • Print then advance: echo $k; $k++; on every inner-loop step.
  • Break the row: echo for letters/spaces; echo PHP_EOL after the inner loop.
  • Complexity: O(n²) time from the triangular letter count; O(1) extra space.

One line: for each row $i, echo the next $i letters from a shared cursor $k, then echo PHP_EOL.

Frequently Asked Questions

Because $k is updated after every printed character and is not reset inside the outer loop. That is what makes the sequence continuous across the triangle.
A single running character starts at A and increments after every print. Row 1 prints 1 character, row 2 prints 2, row 3 prints 3, so you see consecutive letters across the whole triangle.
Because each cell must print a new next letter. If you incremented only once per row, the wider rows would repeat the same letter.
echo sends output without adding a line break. echo PHP_EOL ends the current line with a portable newline. Letters (and optional spaces) use echo; the row break uses echo PHP_EOL after the inner loop.
1+2+…+n = n(n+1)/2. For 5 rows that is 15 letters (A through O).
O(n²) where n is the number of rows. Total echo calls for letters equal n(n+1)/2.
Plain $k++ continues past Z into the next ASCII/string values. Cap rows so n(n+1)/2 ≤ 26, or stop when $k > 'Z', if you want A–Z only.
Use trim(fgets(STDIN)) and check is_numeric($input) before casting to int, then clamp rows so the triangular letter count stays in range for your alphabet policy.

Did you know?

Unlike Program 1 (letters reset to A each row), this pattern uses one running character that increments after every print. Letters stay consecutive across the whole triangle: A, then B C, then D E F, and so on.

Next: Odd-Length Triangle

Rows grow as A, ABC, ABCDE, … — end letter steps by two each time.

Program 14 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