PHP Star Cross Pattern (Over Zeros)

Definition
What Is This Pattern?
An X pattern of stars and zeros fills a rectangular grid: print * on both diagonals and the center column; print 0 everywhere else.
Rule: * if i==j or j==mid or i==cols+1-j; else 0
*000*000*
0*00*00*0
00*0*0*00
000***000 ← rows = 4, cols = 9
In PHP walk every cell with nested loops. Use $mid = intdiv($cols + 1, 2) and a three-part condition to choose * or 0.
Approach
How to Solve It
One nested loop over the grid, plus a three-way star condition.
| Method | Idea | Best for |
|---|
| Diagonals + mid | $i==$j / $j==$mid / anti-diagonal | Learning, interviews, exams |
| Sized grid | Same logic with $rows, $cols, $mid | Practice / demos |
Pseudocode
mid = (cols + 1) / 2
for i from 1 to rows:
for j from 1 to cols:
if i == j or j == mid or i == cols + 1 - j:
print "*"
else:
print "0"
print newline
Cheat sheet
| Goal | Pattern |
|---|
| Walk rows / cols | for ($i = 1; $i <= $rows; $i++) / for ($j = 1; $j <= $cols; $j++) |
| Center column | $mid = intdiv($cols + 1, 2) |
| Star test | if ($i == $j || $j == $mid || $i == $cols + 1 - $j) |
| Print star / fill | echo "*" / echo "0" |
| End the row | echo PHP_EOL |
Printing Numbers vs Starting a New Line
| API | Effect | Use for |
|---|
echo "*" / echo "0" | Stays on the same line | Each cell |
echo PHP_EOL | Ends the current line | After the column loop finishes a row |
Print each cell without a newline, then end the row once.
Try it
Live Preview
Change the row count (width becomes 2 × rows + 1) and the X updates instantly.
Trace
Worked Walkthrough — $rows = 4, $cols = 9
$mid = 5. Trace why key cells print *.
| Cell | Why *? | Row so far |
|---|
(1,1) | $i == $j (main diagonal) | * |
(1,5) | $j == $mid | *000* |
(1,9) | $i == 10 - $j | *000*000* |
(4,4)..(4,6) | diagonal + mid meet | 000***000 |
Every cell is decided once — total prints = $rows × $cols.
Code
PHP Programs
Three complete programs: fixed 4×9, user-input size, and diagonals-only contrast. Use View Output for sample results.
Example 1 — Fixed $rows = 4, $cols = 9
Hard-coded bounds with literals 5 and 10 - $j.
<?php
for ($i = 1; $i <= 4; $i++) {
for ($j = 1; $j <= 9; $j++) {
if ($i == $j || $j == 5 || $i == 10 - $j)
echo "*";
else
echo "0";
}
echo PHP_EOL;
}
*000*000*
0*00*00*0
00*0*0*00
000***000
How It Works
1. Grid walk. Outer $i picks the row; inner $j picks the column.
2. Star test. $i == $j (main), $j == 5 (center), or $i == 10 - $j (anti-diagonal).
3. Fill. Everything else prints 0; echo PHP_EOL ends each row.
Example 2 — User Input (rows & cols)
Read size, compute $mid, and use $cols + 1 - $j for the anti-diagonal.
<?php
echo "Enter rows: ";
$rowsInput = trim(fgets(STDIN));
if (!is_numeric($rowsInput) || (int) $rowsInput < 1) {
echo "Please enter a positive whole number." . PHP_EOL;
exit(1);
}
echo "Enter cols (odd): ";
$colsInput = trim(fgets(STDIN));
if (!is_numeric($colsInput) || (int) $colsInput < 1 || (int) $colsInput % 2 == 0) {
echo "Please enter a positive odd column count." . PHP_EOL;
exit(1);
}
$rows = (int) $rowsInput;
$cols = (int) $colsInput;
$mid = intdiv($cols + 1, 2);
for ($i = 1; $i <= $rows; $i++) {
for ($j = 1; $j <= $cols; $j++) {
if ($i == $j || $j == $mid || $i == $cols + 1 - $j)
echo "*";
else
echo "0";
}
echo PHP_EOL;
}
How It Works
1. Validate size. Require positive rows and an odd $cols so a true center column exists.
2. Same star rule. $mid and $cols + 1 - $j replace the hard-coded 5 and 10 - $j.
Example 3 — Diagonals Only
Drop the center-column check — a pure X without the vertical line.
<?php
for ($i = 1; $i <= 4; $i++) {
for ($j = 1; $j <= 9; $j++) {
if ($i == $j || $i == 10 - $j)
echo "*";
else
echo "0";
}
echo PHP_EOL;
}
*0000000*
0*00000*0
00*000*00
000*0*000
How It Works
1. Two tests only. Main diagonal $i == $j and anti-diagonal $i == 10 - $j.
2. Compare. The middle column of zeros shows what $j == $mid added in Example 1.
Edge Cases & Pitfalls
Check these before calling the solution done.
even colsEven column count
There is no single center column. Prefer odd $cols so $mid is exact.
0-basedLoops from 0 with 1-based formulas
If indices are 0-based, adjust to $i == $j, $j == $mid, and $i + $j == $cols - 1.
ANDUse && instead of ||
Almost no cells match all three tests at once. Border stars need ||.
PHP_EOLecho PHP_EOL inside the column loop
That puts every cell on its own line. Call echo PHP_EOL only after the inner loop.
rows > colsMore rows than columns
The main diagonal exits the grid early. Keep $rows <= $cols for a clear X.
Bad inputCasting without checks
Prefer is_numeric after trim(fgets(STDIN)) so non-numeric input does not silently become 0.
Analysis
Time and Space Complexity
| Program | Time | Extra space |
|---|
| Fixed / diagonals (Examples 1, 3) | O($rows × $cols) | O(1) |
| User input (Example 2) | O($rows × $cols) | O(1) |
Every cell of the grid is visited once, so work is proportional to the product of rows and columns.
Remember
Key Takeaways
Rule: * on main diagonal, anti-diagonal, and center column; 0 elsewhere.
Size: prefer odd $cols; $mid = intdiv($cols + 1, 2); anti-diagonal uses $cols + 1 - $j.
echo vs PHP_EOL: each cell stays on the line; echo PHP_EOL advances after each row.
Next step: Program 46 prints a concentric number square (5..1..5).
One line: visit every cell; print * on the X and center, 0 everywhere else.
Frequently Asked Questions
An X-style grid: * on both diagonals and the center column, with 0 filling the remaining cells (classic demo: 4×9).
With $cols = 9, $mid = intdiv($cols + 1, 2) = 5. Checking $j == $mid draws the vertical center line.
Main diagonal: $i == $j. Anti-diagonal: $i == $cols + 1 - $j (for $cols = 9 that is $i == 10 - $j).
Program 44 prints a centered number diamond. Program 45 prints a rectangular * / 0 grid using diagonal and center conditions.
Use $rows and $cols variables, compute $mid = intdiv($cols + 1, 2), and use $cols + 1 - $j for the anti-diagonal — see Example 2.
O($rows × $cols) because each cell is visited once.
Yes — drop the $j == $mid check for a pure X of diagonals only — see Example 3.
For 1-based indexing, row $i meets column $j on the anti-diagonal when $i + $j equals $cols + 1.
Use trim(fgets(STDIN)) and check is_numeric($input) before casting to int — see Example 2.
🤔
Did you know?
Print * when $i == $j, $j == $mid, or $i == $cols + 1 - $j; otherwise print 0. A $rows × $cols grid visits every cell once.
Next: Concentric Number Square
Print values that decrease toward the center and mirror back out (5..1..5).
Program 46 tutorial →About the author
Developer, cloud engineer, and technical writer
I write practical tutorials so students and working developers can learn by doing—from databases and APIs to deployment on AWS.
6 people found this page helpful