PHP Inverted V Alphabet Pattern

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

What Is This Pattern?

An inverted V-shaped alphabet pattern prints a single tip letter at the top, then matching letter pairs that drift farther apart on each lower row.

Remember
Rule: left print when $i == $j; right print when $i == $k
      (right scan starts at B so tip A stays alone)

    A    
   B B   
  C   C  
 D     D 
E       E     ← A–E (width 9)

Geometry matches the hollow inverted V in Star Pattern 7, but cells print letters instead of *. Stack a mirrored lower half in Program 34 to close a full alphabet diamond.

How to Solve It

Two ways to emit the same outline — start with if/else legs, then optionally share a cell helper.

MethodIdeaBest for
If/else legsLeft $j and right $k scans; letter when indices matchLearning, interviews, exams
Helper + ternaryOne print_cell($row, $col) used by both legsLess duplication once the diagonals click

Pseudocode

Pseudocode
$n = ord($end) - ord('A')     // 4 when end is 'E'
for $i from 0 to $n:
    for $j from $n down to 0:
        echo $alpha[$j] if $i == $j else " "
    for $k from 1 to $n:
        echo $alpha[$k] if $i == $k else " "
    echo PHP_EOL

Cheat sheet

GoalPattern
Scale from end letter$n = ord($end) - ord('A');
Walk each rowfor ($i = 0; $i <= $n; $i++)
Left diagonalfor ($j = $n; $j >= 0; $j--) + if ($i == $j)
Right diagonalfor ($k = 1; $k <= $n; $k++) + if ($i == $k)
Line width2 * $n + 1
End the rowecho PHP_EOL;
Full diamond nextProgram 34

Printing Letters vs Starting a New Line

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

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

Live Preview

Change the end letter and the inverted V updates instantly — including width and letter count.

One letter from A to Z. Width is 2 * (ord(end) - ord('A')) + 1.

Live result A–E · 5 rows · 9 letters
    A    
   B B   
  C   C  
 D     D 
E       E

Worked Walkthrough — A–D ($n = 3)

Trace where each letter lands for every outer-loop value of $i (line width = 7).

$iLeft ($j)Right ($k)LettersPrinted row
0 (A)$j == 0 → Anone ($k starts at 1)1A
1 (B)$j == 1 → B$k == 1 → B2B B
2 (C)$j == 2 → C$k == 2 → C2C C
3 (D)$j == 3 → D$k == 3 → D2D D

Row 0 is the only single-letter line — that is why the right loop must not start at $k = 0. Total letters: 1 + 2 + 2 + 2 = 7 = 2×3 + 1.

PHP Programs

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

Example 1 — Fixed A–E

Hard-coded range — left scan $j = 4..0, right scan $k = 1..4, letter when indices match.

PHP
<?php
$alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

for ($i = 0; $i <= 4; $i++) {
    for ($j = 4; $j >= 0; $j--) {
        if ($i == $j) {
            echo $alpha[$j];
        } else {
            echo " ";
        }
    }
    for ($k = 1; $k <= 4; $k++) {
        if ($i == $k) {
            echo $alpha[$k];
        } else {
            echo " ";
        }
    }
    echo PHP_EOL;
}

How It Works

1. Alphabet table. $alpha[0] is A, $alpha[4] is E.

2. Outer loop picks the row. $i runs from 0 (tip A) to 4 (widest E pair).

3. Left diagonal. $j counts from 4 down to 0; print $alpha[$j] only when $i == $j.

4. Right diagonal, then break. $k runs from 1 to 4 with the same match rule, then echo PHP_EOL.

When $i = 0 only the left loop prints; when $i = 4 both outer columns print E.

Example 2 — End Letter Input

Read the end letter and scale both scans with $n = ord($end) - ord('A'). Prefer validating a single A–Z character in real apps.

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

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

for ($i = 0; $i <= $n; $i++) {
    for ($j = $n; $j >= 0; $j--) {
        echo ($i == $j) ? $alpha[$j] : " ";
    }
    for ($k = 1; $k <= $n; $k++) {
        echo ($i == $k) ? $alpha[$k] : " ";
    }
    echo PHP_EOL;
}

How It Works

1. Prompt and normalize. Read a line, trim it, and take the first character as uppercase.

2. Scale the scans. For end = C, $n = 2 — width 5, tip still a single A.

3. Safer input tip. Bare $line[0] warns on empty input. Prefer:

Safer input
$line = strtoupper(trim(fgets(STDIN)));
if (strlen($line) !== 1 || $line < 'A' || $line > 'Z') {
    echo "Enter a single letter A–Z." . PHP_EOL;
    exit;
}
$end = $line;

Example 3 — Helper Function

Extract one cell printer so both diagonal loops stay thin.

PHP
<?php
function print_cell($alpha, $row, $col) {
    echo ($row == $col) ? $alpha[$col] : " ";
}

$n = 4;
$alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

for ($i = 0; $i <= $n; $i++) {
    for ($j = $n; $j >= 0; $j--) {
        print_cell($alpha, $i, $j);
    }
    for ($k = 1; $k <= $n; $k++) {
        print_cell($alpha, $i, $k);
    }
    echo PHP_EOL;
}

How It Works

1. One cell rule. print_cell owns the $row == $col decision and the space fallback.

2. Same bounds. Left still counts down from $n; right still starts at 1.

3. Same shape, less copy-paste. Learn the expanded if/else first (Example 1), then refactor when the diagonals feel familiar.

Edge Cases & Pitfalls

Check these before calling the solution done.

$k = 0

Duplicate tip A

Starting the right loop at $k = 0 prints two As on the first row. Keep $k = 1.

$j ascending

Mirrored left leg

The left loop must count $j from $n down to 0. Ascending $j flips the left diagonal.

PHP_EOL inside

Broken outline

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

end = A

Single tip

Output is just A — right loop never runs. A good sanity check.

Proportional font

Looks skewed in the IDE

Spaces and letters need a monospace font. Proportional fonts make diagonals look uneven.

Bad input

Validate one letter

Empty lines and multi-character input break naive $line[0] indexing — require a single A–Z character.

Time and Space Complexity

ProgramTimeExtra space
If/else legs (Examples 1–2)O(n²)O(1) beyond the alphabet string
Helper function (Example 3)O(n²)O(1) beyond the alphabet string

About n + 1 rows × 2n + 1 characters printed per row — still quadratic in n. Total letters = 2n + 1 (one tip + two per later row).

Key Takeaways

  • Rule: print $alpha[$col] only when $row == $col; otherwise a space.
  • Two legs: left $j counts down from $n; right $k starts at 1.
  • Break the row: call echo PHP_EOL only after both inner loops.
  • Complexity: O(n²) time; O(1) extra space beyond the alphabet string.

One line: for each row $i, print a letter only when the left or right column index matches $i — start the right loop at 1.

Frequently Asked Questions

Because the right block starts from index 1 (letter B), so it never matches i equals 0. Only the left block prints A on the first row.
Width is 2n+1: n+1 columns from the left block and n columns from the right block. For A–E, n is 4 and width is 9.
Program 31 is wide at the top and has a single bottom vertex. Program 33 has a single A at the top and widens downward with pairs like B B, C C.
echo stays on the same line. echo PHP_EOL ends the current line. Letters and spaces use echo; the row break uses echo PHP_EOL after both inner loops.
O(n²) because there are n+1 rows and each row scans O(n) positions across both blocks.
Spaces keep column alignment so the two diagonals open into a visible inverted V in a monospace console.
Use trim(fgets(STDIN)), require a single A–Z character after strtoupper, and reject empty or multi-character input.
Program 34 reuses this inverted-V row logic for A..E, then mirrors D..A downward to close a full diamond without repeating the widest E row.

Did you know?

This inverted V is the upper half of the alphabet diamond. Starting the right loop at $k = 1 (letter B) is deliberate: on row 0 the left loop already prints the tip A, so visiting index 0 again would duplicate it.

Next: Alphabet Diamond

Stack this inverted V with a mirrored lower half to close a full diamond.

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