PHP Inverted Triangle Star Pattern (Right-Aligned)

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

What Is This Pattern?

An inverted right-aligned triangle shrinks star counts while staying flush on the right: row i has i - 1 leading spaces and rows - i + 1 stars.

Remember
Rule: spaces = i - 1, stars = rows - i + 1

*****
 ****
  ***
   **
    *     ← 5 rows (spaces shown as blanks)

It combines Program 2’s shrinking stars with Program 3’s right alignment. Every row still has width rows before the newline.

How to Solve It

Two inner loops per row — spaces then stars — or the same formulas with str_repeat.

MethodIdeaBest for
Nested loops$j < $i spaces, then $k = $i..$rows starsLearning, interviews, exams
str_repeatBuild spaces and stars as whole stringsShorter demos once loops click

Pseudocode

Pseudocode
for i from 1 to rows:
    for j from 1 to i - 1:     // i - 1 spaces
        echo " "
    for k from i to rows:      // rows - i + 1 stars
        echo "*"
    echo PHP_EOL

Cheat sheet

GoalPattern
Walk each rowfor ($i = 1; $i <= $rows; $i++)
Leading spacesfor ($j = 1; $j < $i; $j++) echo " ";
Shrinking starsfor ($k = $i; $k <= $rows; $k++) echo "*";
Star count formfor ($k = 1; $k <= $rows - $i + 1; $k++)
Fixed width check($i - 1) + ($rows - $i + 1) == $rows
Row shortcutecho str_repeat(" ", $i - 1) . str_repeat("*", $rows - $i + 1) . PHP_EOL;

Printing Stars vs Starting a New Line

APIEffectUse for
echo " " / echo "*"Stays on the same lineEach space and each *
echo PHP_EOLEnds the current lineAfter spaces and stars for that row

Live Preview

Change the row count and the inverted right-aligned triangle updates instantly.

Whole numbers from 1 to 20. Each row has width rows (spaces + stars).

Live result 5 rows · 15 stars
*****
 ****
  ***
   **
    *

Worked Walkthrough — rows = 4

Trace spaces, stars, and total width for each outer-loop value of $i.

$iSpaces $i - 1Stars $rows - $i + 1WidthPrinted row
1044****
2134***
3224**
4314*

Total stars: 4 + 3 + 2 + 1 = 10 = 4×5/2. Width stays 4 on every row.

PHP Programs

Three complete programs: fixed rows, CLI input, and a str_repeat shortcut. Use View Output to reveal sample results.

Example 1 — Fixed $rows = 5

Hard-coded height — ideal for first demos and screenshots.

PHP
<?php
$rows = 5;

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

How It Works

1. Set height. $rows = 5 means five lines, each of width 5.

2. Outer loop picks the row. $i runs from 1 to $rows.

3. Spaces then stars. Print $i - 1 spaces ($j < $i), then stars for $k = $i..$rows (that is $rows - $i + 1 stars).

4. Break the line. echo PHP_EOL after both inner loops starts the next row.

When $i = 1: 0 spaces + 5 stars. When $i = 5: 4 spaces + 1 star.

Example 2 — User Input Version

Read the row count from the CLI. Validate with is_numeric before casting.

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

if (!is_numeric($input) || (int) $input < 1) {
    echo "Please enter a whole number of rows >= 1." . PHP_EOL;
} else {
    $rows = (int) $input;

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

How It Works

1. Prompt and read. Ask for a row count, then trim(fgets(STDIN)) to drop the trailing newline.

2. Validate first. Reject non-numeric or non-positive values before looping.

3. Same nested-loop core. Only the source of $rows changes — the print logic matches Example 1.

Example 3 — str_repeat + Explicit Count

Name the space and star counts, then build each row in one call.

PHP
<?php
$rows = 5;

for ($i = 1; $i <= $rows; $i++) {
    $spaces = $i - 1;
    $stars = $rows - $i + 1;
    echo str_repeat(" ", $spaces) . str_repeat("*", $stars) . PHP_EOL;
}
?>

How It Works

1. Compute both counts. $spaces = $i - 1 and $stars = $rows - $i + 1 make the invert-and-align rule obvious.

2. Build and print. Concatenate the two str_repeat results and append PHP_EOL.

3. Learn loops first. Use Examples 1–2 when you need to show nested bounds; treat this as a polish shortcut afterward.

Edge Cases & Pitfalls

Check these before calling the solution done.

$j <= $i

One extra space

Space loop must be $j < $i (exactly $i - 1 spaces). $j <= $i breaks the right edge.

Program 3 formulas

Grows instead

$rows - $i spaces and 1..$i stars is Program 3. Here use $i - 1 and $rows - $i + 1.

No spaces

Left-aligned invert

Skipping the space loop gives Program 2. Right alignment needs leading spaces.

PHP_EOL inside

Column of characters

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

$rows = 1

Single star

0 spaces + 1 star — same tip case as the other triangle pages.

Bad input

Check is_numeric

Letters or empty input fail is_numeric — validate before casting to int.

Time and Space Complexity

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

Each of n rows prints Θ(n) characters (spaces + stars). Star count alone is still n(n+1)/2.

Key Takeaways

  • Formulas: $i - 1 spaces and $rows - $i + 1 stars.
  • Fixed width: spaces + stars = $rows on every line.
  • Break the row: echo for spaces/stars; echo PHP_EOL after both loops.
  • Complexity: O(n²) time; O(1) extra space for nested loops.

One line: print $i - 1 spaces, then $rows - $i + 1 stars — inverted and flush right.

Frequently Asked Questions

For each row i from 1 to rows, print i minus 1 spaces, then print stars with k running from i to rows inclusive. That prints rows minus i plus 1 stars. Row 1 has no spaces and rows stars; each later row adds one space and removes one star while keeping the same right edge.
The range i through rows has length rows minus i plus 1, which matches the star count. An equivalent loop is k from 1 to rows minus i plus 1.
Program 3 uses (rows - i) spaces and stars 1 through i. Program 4 uses (i - 1) spaces and stars i through rows. Same right alignment; star counts grow in Program 3 and shrink in Program 4.
Program 2 is left-aligned with shrinking stars. Program 4 adds growing leading spaces so the same shrinking star counts stay flush on the right.
echo sends output without adding a line break. PHP_EOL ends the current line with a portable newline. Spaces and stars use echo; the row break uses echo PHP_EOL after both inner loops.
O(n²) for n rows. Each row prints on the order of n characters; there are n rows.
Yes. echo str_repeat(" ", $i - 1) . str_repeat("*", $rows - $i + 1) . PHP_EOL;
j from 1 to i-1 (written as j < i) prints exactly i - 1 spaces. Using j <= i would add one extra space and break the right edge.

Did you know?

This pattern merges Program 2’s shrinking star count with Program 3’s right alignment. Every row still has width rows: (i - 1) + (rows - i + 1) = rows.

Next: Center Pyramid

Use leading spaces and odd star counts (2 * i - 1) to print a full pyramid.

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