PHP Alphabet Pattern (Decrease then Increase)

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

What Is This Pattern?

Decreasing and increasing alphabet rows keep a fixed width: each row starts with a growing descending prefix, then fills the rest with a shrinking ascending suffix from A.

Remember
Rule: prefix i..1  +  suffix 0..(n−i)   →  width = n+1

ABCDE
BABCD
CBABC
DCBAB
EDCBA     ← end = 'E' (n = 4)

As the left side grows (B, CB, DCB, …), the right side shrinks (ABCD, ABC, AB, A) so every line stays the same length. Compare with Program 24 (palindrome triangles) and Program 29 (layered diamond).

How to Solve It

Two ways to emit the same grid — inline two loops per row, or factor a print_row helper.

MethodIdeaBest for
Two loops inlineDescending $i..1, then ascending 0..($n−$i)Learning, interviews, exams
print_row helperOne function owns both parts; outer loop only picks $iCleaner demos once the width budget clicks

Pseudocode

Pseudocode
$n = ord($end) - ord('A')
for $i from 0 to $n:
    for $j from $i down to 1:   echo $alpha[$j]
    for $k from 0 to $n - $i:   echo $alpha[$k]
    echo PHP_EOL

Cheat sheet

GoalPattern
End index$n = ord($end) - ord('A'); (4 for E)
Rowsfor ($i = 0; $i <= $n; $i++)
Descending prefixfor ($j = $i; $j > 0; $j--) echo $alpha[$j];
Ascending suffixfor ($k = 0; $k <= $n - $i; $k++) echo $alpha[$k];
Skip duplicate APrefix stops at $j > 0 (never prints index 0)
WidthAlways $n + 1 ($i + ($n − $i + 1))
Palindrome trianglesSee Program 24

Printing Letters vs Starting a New Line

APIEffectUse for
echoStays on the same lineEach letter in both parts
echo PHP_EOLEnds the current lineAfter both loops finish a row

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

Live Preview

Change the end letter and the fixed-width decreasing/increasing grid updates instantly — every row has length n + 1.

One letter from A to F. Tap a chip or type a letter — the preview redraws as you go.

Live result End E · 5 rows · width 5
ABCDE
BABCD
CBABC
DCBAB
EDCBA

Worked Walkthrough — End = E ($n = 4)

Trace each row index, both parts, and the joined 5-letter line.

$iPrefix ($i..1)Suffix (0..4−$i)Printed row
0(empty)ABCDEABCDE
1BABCDBABCD
2CBABCCBABC
3DCBABDCBAB
4EDCBAEDCBA

Width is always 4 + 1 = 5. The last row is a full reverse run ending at a single A.

PHP Programs

Three complete programs: fixed A–E, end-letter input, and a helper-function rewrite. Use View Output to reveal sample results.

Example 1 — Fixed A–E

Matches the reference logic: print $alpha[$i]…$alpha[1], then $alpha[0]…$alpha[4 − $i].

PHP
<?php
$alpha = str_split("ABCDEFGHIJKLMNOPQRSTUVWXYZ");

for ($i = 0; $i <= 4; $i++) {
    for ($j = $i; $j > 0; $j--)
        echo $alpha[$j];

    for ($k = 0; $k <= 4 - $i; $k++)
        echo $alpha[$k];

    echo PHP_EOL;
}

How It Works

1. Row index sets the start. Outer loop runs $i from 0 to 4 (letters A…E).

2. Descending prefix (skip A). $j runs from $i down to 1 — when $i = 2, that prints CB.

3. Ascending suffix fills the rest. $k runs from 0 to 4 − $i — when $i = 2, that prints ABC.

4. Constant width. Prefix length + suffix length is always 5 (CBABC).

Example 2 — End Letter Input

Works for A..end with the same two-part row. Prefer validating a single A–Z character in real apps.

PHP
<?php
echo "Enter end letter (like E): ";
$end = strtoupper(trim(fgets(STDIN)))[0];

$n = ord($end) - ord('A');
$alpha = str_split("ABCDEFGHIJKLMNOPQRSTUVWXYZ");

for ($i = 0; $i <= $n; $i++) {
    for ($j = $i; $j > 0; $j--)
        echo $alpha[$j];

    for ($k = 0; $k <= $n - $i; $k++)
        echo $alpha[$k];

    echo PHP_EOL;
}

How It Works

1. Scale with n. $n = ord($end) - ord('A') drives both loops. For end = C, width is 3 and you get three rows.

2. Same core. Only the end index changes; the prefix/suffix width budget is unchanged.

3. Safer input tip. Prefer:

Safer input
$raw = strtoupper(trim(fgets(STDIN)));
if ($raw === '' || strlen($raw) !== 1 || $raw < 'A' || $raw > 'Z') {
    echo "Enter one letter from A to Z." . PHP_EOL;
    exit;
}
$end = $raw[0];

Example 3 — Helper Function

Often clearer: one function owns both parts so the main script only walks row indexes.

PHP
<?php
function print_row($alpha, $n, $i) {
    for ($j = $i; $j > 0; $j--)
        echo $alpha[$j];

    for ($k = 0; $k <= $n - $i; $k++)
        echo $alpha[$k];

    echo PHP_EOL;
}

$n = 4;
$alpha = str_split("ABCDEFGHIJKLMNOPQRSTUVWXYZ");

for ($i = 0; $i <= $n; $i++)
    print_row($alpha, $n, $i);

How It Works

1. print_row owns both parts. Prefix and suffix live in one place.

2. Thin outer loop. The script only decides which row index $i to print.

Edge Cases & Pitfalls

Check these before calling the solution done.

j >= 0

Duplicate A at the join

If the prefix includes index 0, you get …AA…. Keep for ($j = $i; $j > 0; $j--).

Wrong suffix end

Uneven row widths

Suffix must stop at $n − $i. Ending at a fixed $n makes later rows too long.

PHP_EOL inside

Column of letters

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

end = A

Single A

When $n = 0, you print one row: A. A good sanity check.

i = 0

Empty prefix is normal

The first row prints only the ascending suffix A..end — that is expected, not a bug.

Bad input

Validate one letter

Trim, uppercase, and require length 1 in A–Z — reject empty or multi-character tokens.

Time and Space Complexity

ProgramTimeExtra space
Two loops inline (Examples 1–2)O(n²)O(1) (plus the fixed alphabet table)
Helper function (Example 3)O(n²)O(1)

For letters A..end there are $n + 1 rows, each of width $n + 1 — quadratic in n.

Key Takeaways

  • Rule: prefix $i..1 + suffix 0..($n − $i).
  • Width budget: prefix grows as suffix shrinks — total always $n + 1.
  • Break the row: call echo PHP_EOL only after both loops.
  • Complexity: O(n²) time; O(1) extra space.

One line: for each $i, print $i down to B, then A up through index $n − $i.

Frequently Asked Questions

A is printed in the second loop. If the first loop included A, the join would duplicate A.
To keep each row the same width, end the ascending part at indices 0..(n − i). For A..E that is A + E − i, so both parts always add up to n+1 letters.
Yes. Set $n = ord($end) − ord('A') and keep the same loops: descending $j from $i down to 1, then ascending $k from 0 to $n − $i.
O(n²) for n letters because there are n rows and each row prints O(n) characters.
The descending prefix has length i and the ascending suffix has length (n − i + 1). Together they always equal n + 1.
echo stays on the same line. echo PHP_EOL ends the current line. Letters use echo; the row break uses echo PHP_EOL after both loops.
Program 24 builds palindrome triangles around A. This page keeps fixed-width rows by trading a growing descending prefix against a shrinking ascending suffix.
The descending loop does nothing, so you print only the ascending suffix A..end — for E that is ABCDE.

Did you know?

For each row i (A..E), print a descending prefix from i down to B (skip A), then print an ascending suffix from A up to A + E - i. That cap keeps row width constant at E - A + 1.

Next: V-Shaped Alphabet Pattern

Move from fixed-width letter rows to a V drawn only on two diagonals meeting at the tip.

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