PHP Inverted Triangle Star Pattern (Right-Angled)

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

What Is This Pattern?

An inverted right-angled triangle star pattern prints a left-aligned upside-down staircase of * characters: the first row has rows stars, and each next row has one fewer down to 1.

Remember
Rule: on outer value i, print i stars (i counts down)

*****
****
***
**
*         ← 5 rows

In PHP you solve it with two nested for loops: the outer loop counts from $rows down to 1, the inner loop prints stars with echo "*", then echo PHP_EOL moves to the next line. It is the mirror of Program 1 — same inner loop, reversed outer direction.

How to Solve It

Two ways to emit the same shape — start with a countdown outer loop, then optionally use a forward formula or str_repeat.

MethodIdeaBest for
Countdown outer$i = $rows..1, inner prints $i stars via echo "*"Learning, interviews, clearest invert of Program 1
Forward + formula$i = 1..$rows, print $rows - $i + 1 starsWhen you prefer ascending counters
str_repeatBuild a whole row in one call while counting downShorter demos once loops click

Pseudocode

Pseudocode
for i from rows down to 1:
    for j from 1 to i:
        echo "*"
    echo PHP_EOL

Cheat sheet

GoalPattern
Countdown rowsfor ($i = $rows; $i >= 1; $i--)
Print $i starsfor ($j = 1; $j <= $i; $j++) echo "*";
End the rowecho PHP_EOL;
Forward equivalentfor ($j = 1; $j <= $rows - $i + 1; $j++)
One-line row shortcutecho str_repeat("*", $i) . PHP_EOL; while counting down
Upright versionfor ($i = 1; $i <= $rows; $i++) → Program 1

Printing Stars vs Starting a New Line

APIEffectUse for
echo "*"Stays on the same lineEach *
echo PHP_EOLEnds the current lineAfter the inner loop

Live Preview

Change the row count and the inverted triangle updates instantly — including the triangular star total.

Whole numbers from 1 to 20. Tap a chip or type a value — the preview redraws as you go. The first line has that many stars.

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

Worked Walkthrough — rows = 4

Trace each outer-loop value of $i as it counts down, and count how many times the inner loop runs.

$iInner $jPrinted rowStars
41..4****4
31..3***3
21..2**2
11..1*1

Total star prints: 4 + 3 + 2 + 1 = 10 = 4×5/2. Same triangular sum as Program 1 — time is still O(n²).

PHP Programs

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

Example 1 — Fixed $rows = 5

Hard-coded height with a countdown outer loop — the clearest invert of Program 1.

PHP
<?php
$rows = 5;

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

How It Works

1. Set height. $rows = 5 means the triangle has five lines; the first line has five stars.

2. Outer loop counts down. $i runs from $rows down to 1.

3. Inner loop prints stars. For each $i, $j runs from 1 to $i, so the current row gets exactly $i stars via echo "*".

4. Break the line. echo PHP_EOL after the inner loop starts the next (shorter) row.

When $i = 5 you get *****; when $i = 4 you get ****; and so on down to one 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 = $rows; $i >= 1; $i--) {
        for ($j = 1; $j <= $i; $j++) {
            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 countdown print logic matches Example 1.

Example 3 — str_repeat

Build each row in one call while counting down — same shape, no explicit inner star loop.

PHP
<?php
$rows = 5;

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

How It Works

1. One outer loop. Still walk $i from $rows down to 1.

2. Build the row. str_repeat("*", $i) creates a string of length $i filled with stars.

3. Print and advance. Concatenate PHP_EOL so the row ends correctly.

Learn the two-loop version first (Examples 1–2) so you can explain both bounds in an interview; treat this as a polish shortcut afterward.

Edge Cases & Pitfalls

Check these before calling the solution done.

Wrong direction

Upright instead of inverted

If you use $i = 1..$rows instead of $i = $rows..1, you get Program 1’s growing triangle. For the inverted shape, count down — or use $rows - $i + 1 stars with a forward loop.

PHP_EOL inside

Column of stars

If echo PHP_EOL is inside the inner loop, each star lands on its own line. Use echo "*" for stars; end the row only after the inner loop.

$j <= $rows

Rectangle, not triangle

Inner bound must be $j <= $i (or $j <= $rows - $i + 1). $j <= $rows prints a filled rectangle.

No PHP_EOL

One endless line

Omitting the row break glues every star onto a single line.

$rows = 1

Single star

Output is just * on one line — a good sanity check (same as Program 1).

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 (Example 3)O($rows²)O($rows) per temporary row string

Total stars printed = n + (n-1) + … + 1 = n(n+1)/2, which is still quadratic in n — identical to Program 1.

Key Takeaways

  • Rule: outer value $i prints exactly $i stars, with $i counting from $rows down to 1.
  • Same as Program 1: only the outer loop direction changes; the inner star loop stays $j = 1..$i.
  • Break the row: call echo PHP_EOL only after the inner loop.
  • Complexity: O(n²) time from the triangular star count; O(1) extra space for nested loops.

One line: for $i from $rows down to 1, print $i stars with echo, then echo PHP_EOL.

Frequently Asked Questions

The outer loop runs i from rows down to 1. For each i, the inner loop prints i stars. The first output line uses i equal to rows so it is the longest; each later line has a smaller i, so the triangle points downward.
Program 1 uses for ($i = 1; $i <= $rows; $i++) so stars grow. This program uses for ($i = $rows; $i >= 1; $i--) so stars shrink. The inner loop still runs j from 1 to i.
Yes. Use for ($i = 1; $i <= $rows; $i++) and print ($rows - $i + 1) stars in the inner loop. Both styles produce the same shape.
echo sends output without adding a line break. PHP_EOL ends the current line with a portable newline. Stars use echo; the row break uses echo PHP_EOL after the inner loop.
O(n²) for n rows. Total stars are still n(n+1)/2, same as the upright triangle.
Yes. echo str_repeat("*", $i) . PHP_EOL prints a full row in one call while i counts down.
Use trim(fgets(STDIN)) and check is_numeric($input) before casting to int so bad input does not produce unexpected results.
The outer loop never runs, so nothing is printed. Validate and prompt again if you want a clear user message.

Did you know?

This inverted triangle uses the same inner loop as Program 1 — only the outer loop direction changes. Total stars stay n(n+1)/2, so complexity is still O(n²).

Next: Right-Aligned Triangle

Add leading spaces so the triangle leans to the right instead of the left.

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