PHP Pyramid Star Pattern (Center-Aligned)

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

What Is This Pattern?

A center-aligned pyramid grows to a wide base with a single peak: row i has rows - i leading spaces and 2 * i - 1 stars.

Remember
Rule: spaces = rows - i, stars = 2 * i - 1

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

It reuses Program 3’s spacing idea, but uses odd star counts so the shape widens on both sides. The same row formula is the upper half of the filled diamond.

How to Solve It

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

MethodIdeaBest for
Nested loops$rows - $i spaces, then 2 * $i - 1 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 (rows - i):
        echo " "
    for k from 1 to (2 * i - 1):
        echo "*"
    echo PHP_EOL

Cheat sheet

GoalPattern
Walk each rowfor ($i = 1; $i <= $rows; $i++)
Leading spacesfor ($j = 1; $j <= $rows - $i; $j++) echo " ";
Odd star runfor ($k = 1; $k <= 2 * $i - 1; $k++) echo "*";
Base width2 * $rows - 1 stars on the last row
Invert laterfor ($i = $rows; $i >= 1; $i--) → Program 6
Row shortcutecho str_repeat(" ", $rows - $i) . str_repeat("*", 2 * $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 pyramid updates instantly — including the perfect-square star total.

Whole numbers from 1 to 15. Base width = 2 * rows - 1; total stars = rows².

Live result 5 rows · 25 stars
    *
   ***
  *****
 *******
*********

Worked Walkthrough — rows = 4

Trace spaces and odd star counts for each outer-loop value of $i.

$iSpaces $rows - $iStars 2 * $i - 1Printed row
131*
223***
315*****
407*******

Total stars: 1 + 3 + 5 + 7 = 16 = 4². Base width: 2×4 - 1 = 7.

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 <= $rows - $i; $j++) {
        echo " ";
    }
    for ($k = 1; $k <= 2 * $i - 1; $k++) {
        echo "*";
    }
    echo PHP_EOL;
}
?>

How It Works

1. Set height. $rows = 5 means five lines; the base has 2 * 5 - 1 = 9 stars.

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

3. Spaces then stars. Print $rows - $i spaces, then 2 * $i - 1 stars with echo.

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

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

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 <= $rows - $i; $j++) {
            echo " ";
        }
        for ($k = 1; $k <= 2 * $i - 1; $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 for Spaces and Stars

Build each row in one expression — same shape, no explicit space/star character loops.

PHP
<?php
$rows = 5;

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

How It Works

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

2. Build the row. str_repeat(" ", $rows - $i) for padding; str_repeat("*", 2 * $i - 1) for the odd star run.

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.

2 * $i

Even width

Use 2 * $i - 1 (odd). Even widths lose the classic single-center peak.

$j < $rows - $i

One space short

Space loop must be $j <= $rows - $i. A strict < shifts the peak.

Only $i stars

Program 3 shape

Same spaces with $i stars is the right-aligned triangle, not a full pyramid.

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 — a good tip sanity check.

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). Total stars = 1 + 3 + … + (2n - 1) = n².

Key Takeaways

  • Formulas: $rows - $i spaces and 2 * $i - 1 stars.
  • Odd widths: keep 2 * $i - 1 for a single centered peak.
  • Break the row: echo for spaces/stars; echo PHP_EOL after both loops.
  • Complexity: O(n²) time; total stars = n²; O(1) extra space for nested loops.

One line: print $rows - $i spaces, then 2 * $i - 1 stars — that is the centered pyramid.

Frequently Asked Questions

2*i-1 gives odd lengths 1, 3, 5, … so each row adds one star on both sides. Using only i stars per row would not form the usual symmetric centered pyramid.
Printing (rows - i) spaces before the stars shifts the star block left as i grows, keeping the peak centered when the font is fixed-width.
Yes. Keep the same inner loops but run the outer loop from rows down to 1. The first printed row is the widest; later rows narrow toward the tip. See Program 6.
The last row has 2 * rows - 1 stars and no leading spaces when i equals rows.
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 Theta(n) characters in the worst case; there are n rows. Total stars equal n².
Program 3 uses the same (rows - i) spaces but only i stars. Program 5 uses 2*i-1 stars so the shape widens on both sides.
Yes. echo str_repeat(" ", $rows - $i) . str_repeat("*", 2 * $i - 1) . PHP_EOL builds each row without explicit inner character loops.

Did you know?

Odd star counts 1, 3, 5, … come from 2 * i - 1. Their sum for n rows is n² — so total stars grow as a perfect square. This pyramid is also the upper half of the filled diamond.

Next: Inverted Pyramid

Flip the outer loop and print a wide-to-narrow centered pyramid.

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