使用 PHP 循環繪製幾何圖形是經典練習題,亦是理解座標計算、字串填充、循環控制的良好切入點。本文提供實心與空心菱形的完整演算法分析、優化代碼與 str_pad 進階用法。
菱形邊長 N,總行數 rows = 2N - 1。以行索引 i (0-based) 計算:
N - i - 12i + 1i - N + 12(rows - i) - 1/**
* 繪製實心菱形
* @param int $n 邊長 (default 5)
* @param string $char 顯示字符 (default *)
* @return string
*/
function solidDiamond(int $n = 5, string $char = '*'): string
{
$rows = $n * 2 - 1;
$output = '';
for ($i = 0; $i < $rows; $i++) {
if ($i < $n) { // 上半部
$spaces = $n - $i - 1;
$chars = $i * 2 + 1;
} else { // 下半部
$spaces = $i - $n + 1;
$chars = ($rows - $i) * 2 - 1;
}
// str_pad($input, $length, $pad_string, $pad_type)
$output .= str_pad('', $spaces, ' ')
. str_pad('', $chars, $char)
. "\n";
}
return $output;
}
// 輸出
echo '<pre>';
echo solidDiamond(5);
echo '</pre>';
*
***
*****
*******
*********
*******
*****
***
*
核心思路:每行實際字符數 total,其中首尾為字符,中間 total - 2 為空格。使用 STR_PAD_BOTH 將字符置於兩側。
/**
* 繪製空心菱形
* @param int $n 邊長
* @param string $char 顯示字符
* @return string
*/
function hollowDiamond(int $n = 5, string $char = '*'): string
{
$rows = $n * 2 - 1;
$output = '';
for ($i = 0; $i < $rows; $i++) {
if ($i < $n) { // 上半部
$total = $i * 2 + 1;
$spaces = $n - $i - 1;
} else { // 下半部
$total = ($rows - $i) * 2 - 1;
$spaces = $i - $n + 1;
}
if ($total == 1) {
// 頂點/底點僅一字符
$line = str_pad('', $spaces, ' ') . $char;
} else {
// 中空行:首尾字符,中間空格
$inner = str_pad('', $total - 2, ' ', STR_PAD_BOTH);
$line = str_pad('', $spaces, ' ')
. str_pad($inner, $total, $char, STR_PAD_BOTH);
}
$output .= $line . "\n";
}
return $output;
}
echo '<pre>';
echo hollowDiamond(5);
echo '</pre>';
*
* *
* *
* *
* *
* *
* *
* *
*
| 參數 | 說明 | 範例 |
|---|---|---|
$input | 輸入字符串 | '' (空字符串) |
$length | 目標長度 | 5 |
$pad_string | 填充字符(可多字符) | '*', 'ab' |
$pad_type | 填充方向 | STR_PAD_RIGHT(預設), STR_PAD_LEFT, STR_PAD_BOTH |
$inner = str_pad('', 3, ' ', STR_PAD_BOTH); // " " (3空格)
$line = str_pad($inner, 5, '*', STR_PAD_BOTH); // "* *"
# 邏輯:將 $inner 置中,兩側用 * 填充至長度 5
sprintf 或預分配陣列 array_fill 再 implode,避免字符串連接開銷str_pad('', 10, '★ ') 可產生重複圖案\033[31m 實現彩色菱形\n 替換為 <br>,空格用 ,包裹 <pre>interface ShapeDrawer {
public function draw(int $size, string $char): string;
}
class DiamondDrawer implements ShapeDrawer {
public function draw(int $n, string $char = '*'): string { ... }
public function drawHollow(int $n, string $char = '*'): string { ... }
}
// 使用
$drawer = new DiamondDrawer();
echo $drawer->draw(7, '#');
掌握 str_pad 與循環座標計算,不僅能繪製菱形,更能舉一反三實現三角形、六邊形、數字金字塔等任意字符圖形,是 PHP 字符串操作與邏輯思維的優秀練習。