PHP Right-Angled Triangle Star Pattern

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

What Is This Pattern?

A right-angled triangle star pattern prints a left-aligned staircase of * characters: row i has exactly i stars.

Remember
Rule: on row i, print i stars

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

In PHP you solve it with two nested for loops: the outer loop picks the row, the inner loop prints stars on that row, then echo PHP_EOL; moves to the next line. Once this clicks, inverted triangles, pyramids, and hollow shapes become much easier.

How to Solve It

Two ways to emit the same shape — start with nested loops, then optionally shorten with str_repeat.

MethodIdeaBest for
Nested loopsOuter = rows, inner = stars via echo "*"Learning, interviews, exams
str_repeat("*", $i)Build a whole row in one callShorter demos once loops click

Pseudocode

Pseudocode
for i from 1 to rows:
    for j from 1 to i:
        print "*" (no newline)
    print newline

Cheat sheet

GoalPattern
Walk each rowfor ($i = 1; $i <= $rows; $i++)
Print i starsfor ($j = 1; $j <= $i; $j++) echo "*";
End the rowecho PHP_EOL;
One-line row shortcutecho str_repeat("*", $i) . PHP_EOL;
Invert laterfor ($i = $rows; $i >= 1; $i--) → Program 2

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 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.

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

Worked Walkthrough — rows = 4

Trace each outer-loop value of i and count how many times the inner loop runs.

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

Total star prints: 1 + 2 + 3 + 4 = 10 = 4×5/2. That triangular sum is why time is O(n²).

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 "*";
    }
    echo PHP_EOL;
}
?>

How It Works

1. Set height. $rows = 5 means the triangle has five lines.

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

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

4. Break the line. echo PHP_EOL; after the inner loop starts the next row.

When $i = 1 you get *; when $i = 2 you get **; and so on up to five stars.

Example 2 — User Input Version

Read the row count from the CLI. Prefer is_numeric in real apps (shown in the tip below).

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

for ($i = 1; $i <= $rows; $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)) and cast to int.

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

3. Safer input tip. Bare (int) casts turn letters into 0. Prefer:

Safer input
echo "Enter the number of rows: ";
$input = trim(fgets(STDIN));
if (!is_numeric($input) || (int) $input < 1) {
    echo "Enter a positive whole number." . PHP_EOL;
    exit(1);
}
$rows = (int) $input;

Example 3 — str_repeat("*", $i)

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

PHP
<?php
$rows = 5;

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

How It Works

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

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

3. Print and advance. Concatenate PHP_EOL so each row ends cleanly.

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.

PHP_EOL inside

Column of stars

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

j <= rows

Rectangle, not triangle

Inner bound must be $j <= $i. $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.

rows ≤ 0

Empty output

Outer loop never runs. Validate and re-prompt for interactive programs.

Bad input

Check is_numeric

Bare (int) casts turn non-numeric strings into 0 — prefer is_numeric before casting.

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 = 1 + 2 + … + n = n(n+1)/2, which is still quadratic in n.

Key Takeaways

  • Rule: row i prints exactly i stars.
  • Two loops: outer = rows, inner = stars with echo "*".
  • 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 each row i, print i stars with echo, then echo PHP_EOL.

Frequently Asked Questions

The outer loop runs i from 1 to rows. For each row i, the inner loop runs j from 1 to i and prints a star with echo. Row 1 prints 1 star, row 2 prints 2 stars, and so on.
You need one loop for which row you are on and another for how many characters belong on that row. Nested for loops express that directly.
echo stays on the same line. echo PHP_EOL ends the current line. Stars use echo "*"; the row break uses echo PHP_EOL after the inner loop.
Reverse the outer loop so i runs from rows down to 1, for example for ($i = $rows; $i >= 1; $i--). The first line then has rows stars. See Program 2.
O(n²) where n is the number of rows. Total echo calls equal 1+2+…+n = n(n+1)/2.
Yes. echo str_repeat("*", $i) . PHP_EOL prints a full row in one call. Nested loops are better for learning; str_repeat is a handy shortcut later.
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?

Row i prints exactly i stars. Total stars for n rows is the triangular number n(n+1)/2 — the same count that makes this pattern O(n²).

Next: Inverted Triangle

Flip the outer loop and print an upside-down right-angled star pattern.

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