PHP Alphabet Square Pattern (Symmetric Decreasing)

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

What Is This Pattern?

A symmetric decreasing alphabet square prints fixed-width mirrored rows whose interior floor drops from the top letter down to a single center A.

Remember
Rule: for floor i from k down to 0,
      left j = k..0 and right j = 1..k;
      print j if j > i, else print i

E E E E E E E E E
E D D D D D D D E
E D C C C C C D E
E D C B B B C D E
E D C B A B C D E     ← top = 'E' (k = 4, width 9)

The right half starts at j = 1 (B) so the center A is not duplicated. Program 29 reuses this row rule in two phases to form a full diamond.

How to Solve It

Two ways to emit the same square — inline floor checks, then optionally a shared helper for both halves.

MethodIdeaBest for
Inline $j > $iLeft $k..0 + right 1..$k with the same ternaryLearning, interviews, exams
Helper functionOne print_cell owns the floor ruleCleaner demos once the rule clicks

Pseudocode

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

Cheat sheet

GoalPattern
Top index$k = ord($top) - ord('A'); (4 for E)
Drop the floorfor ($i = $k; $i >= 0; $i--)
Left halffor ($j = $k; $j >= 0; $j--) + $j > $i ? $alpha[$j] : $alpha[$i]
Right halffor ($j = 1; $j <= $k; $j++) (skip 0)
End the rowecho PHP_EOL;
Row width2 * $k + 1 (9 for A..E)
Avoid double AStart the right loop at 1, not 0

Printing Letters vs Starting a New Line

APIEffectUse for
echoStays on the same lineEach letter (and its trailing space)
echo PHP_EOLEnds the current lineAfter both half-loops

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

Live Preview

Change the top letter and the layered square updates instantly — width is always 2k + 1.

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

Live result Top E · 5 rows · width 9
E E E E E E E E E
E D D D D D D D E
E D C C C C C D E
E D C B B B C D E
E D C B A B C D E

Worked Walkthrough — Top = E ($k = 4)

Trace each row floor and the resulting 9-letter line.

$iFloor letterPrinted row
4EE E E E E E E E E
3DE D D D D D D D E
2CE D C C C C C D E
1BE D C B B B C D E
0AE D C B A B C D E

Width is always 2×4 + 1 = 9. The last row is the full palindrome around a single A. Total cells: 5 × 9 = 45.

PHP Programs

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

Example 1 — Fixed A–E

Two symmetric scans per row with the same $j > $i check.

PHP
<?php
$k = 4; // index for 'E'
$alpha = str_split("ABCDEFGHIJKLMNOPQRSTUVWXYZ");

for ($i = $k; $i >= 0; $i--) {
    for ($j = $k; $j >= 0; $j--)
        echo ($j > $i ? $alpha[$j] : $alpha[$i]) . " ";

    for ($j = 1; $j <= $k; $j++)
        echo ($j > $i ? $alpha[$j] : $alpha[$i]) . " ";

    echo PHP_EOL;
}

How It Works

1. Fix the top index. $k = 4 means the highest letter is $alpha[4] = E.

2. Drop the floor. Outer $i runs from $k down to 0 — one interior floor per row.

3. Left half. Scan $j from $k down to 0; print $alpha[$j] when $j > $i, else $alpha[$i].

4. Right half, then break. Scan $j from 1 to $k with the same rule, then echo PHP_EOL.

When $i = 2 (floor C), columns where $j > 2 print E/D borders, and interior cells print C.

Example 2 — Top Letter Input

Works for A..top with the same symmetric square. Prefer validating a single A–Z character in real apps.

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

$k = ord($top) - ord('A');
$alpha = str_split("ABCDEFGHIJKLMNOPQRSTUVWXYZ");

for ($i = $k; $i >= 0; $i--) {
    for ($j = $k; $j >= 0; $j--)
        echo ($j > $i ? $alpha[$j] : $alpha[$i]) . " ";

    for ($j = 1; $j <= $k; $j++)
        echo ($j > $i ? $alpha[$j] : $alpha[$i]) . " ";

    echo PHP_EOL;
}

How It Works

1. Prompt and scale. $k = ord($top) - ord('A') sets both the floor loop and the two halves.

2. Same square core. Width becomes 2 * $k + 1 (5 letters for top = C).

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;
}
$top = $raw[0];

Example 3 — Helper Function

Often clearer to read: one function applies the floor rule so left and right loops stay thin.

PHP
<?php
function print_cell($alpha, $j, $i) {
    echo ($j > $i ? $alpha[$j] : $alpha[$i]) . " ";
}

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

for ($i = $k; $i >= 0; $i--) {
    for ($j = $k; $j >= 0; $j--)
        print_cell($alpha, $j, $i);

    for ($j = 1; $j <= $k; $j++)
        print_cell($alpha, $j, $i);

    echo PHP_EOL;
}

How It Works

1. Own the rule once. print_cell applies $j > $i in a single place.

2. Thin loops. Left and right loops only decide which columns to visit.

3. Same shape. Output matches Examples 1–2 — useful when you want to explain the floor rule separately.

Edge Cases & Pitfalls

Check these before calling the solution done.

j = 0

Duplicate center A

If the right half starts at 0, the last row prints A twice. Keep for ($j = 1; $j <= $k; $j++).

j >= i

Wrong borders

Using $j >= $i changes which cells belong to the floor vs the border. Stick to strict $j > $i.

PHP_EOL inside

Column of letters

If echo PHP_EOL is inside either half-loop, each cell lands on its own line. Use echo for cells; end the row only after both halves.

top = A

Single A

When $k = 0, output is just A — right half never runs. A good sanity check.

top < A

Empty / invalid

Validate A–Z before computing $k.

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
Inline loops (Examples 1–2)O(n²)O(1) (plus the fixed alphabet table)
Helper function (Example 3)O(n²)O(1)

For $n = $k + 1 rows of width 2 * $k + 1, total cells = $n × (2n - 1) — still quadratic in n.

Key Takeaways

  • Rule: for floor $i, print $j > $i ? $alpha[$j] : $alpha[$i] on both halves.
  • Mirror cleanly: left $k..0, right 1..$k — skip duplicating center A.
  • Break the row: call echo PHP_EOL only after both half-loops.
  • Complexity: O(n²) time; O(1) extra space.

One line: for each floor $i from top down to A, scan left $k..0 and right 1..$k, printing $j > $i ? $alpha[$j] : $alpha[$i], then echo PHP_EOL.

Frequently Asked Questions

It prints the border letters when the column letter j is above the current row floor i; otherwise it prints i. This builds higher-letter borders with a flat interior.
The first loop scans E down to A. The second scans B up to E so the middle A is printed once and the row is mirrored.
For letters A..k, width is (k-A+1) + (k-A) = 2*(k-A)+1. For A..E, width is 9.
Pick a larger top letter (like H), set $k = ord($top) - ord('A'), and keep the same loop structure.
O(n²) for n letters because there are n rows and each row prints O(n) cells.
Starting at 0 would print $alpha[0] (A) again and duplicate the center. Starting at 1 (B) mirrors the left half cleanly.
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 half-loops.
Use trim(fgets(STDIN)), take the first character after strtoupper, require A–Z, and reject empty or multi-character tokens.

Did you know?

Fix k at the top letter (E). Outer loop i goes from k down to A. Left half scans j = k..A; right half scans j = B..k so A appears once in the middle. Each position prints j when j > i, otherwise prints i.

Next: Reverse Centered Pyramid

Reuse this row rule in two phases to build a full diamond without duplicating the center.

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