array_fill() 能以單一值快速產生指定長度、指定起始索引的數值索引陣列,是初始化預設值、建立查找表、測試資料生成的高效工具。
語法與參數
array_fill(int $startIndex, int $count, mixed $value): array
| 參數 | 型別 | 必要性 | 說明 |
$startIndex | int | 必填 | 第一個元素的索引值(可為負數)。 |
$count | int | 必填 | 元素數量,必須 > 0,否則拋出 ValueError (PHP 8.0+) / Warning (舊版)。 |
$value | mixed | 必填 | 填充值,支援任意型別(含物件、陣列、null)。 |
核心行為特徵
- 僅產生數值索引:索引從
$startIndex 開始遞增 1,不支援字串鍵名。
- 負數索引支援:
array_fill(-2, 3, 'x') → [-2=>'x', -1=>'x', 0=>'x']。
- 值為引用複製:填充物件/陣列時,所有元素指向同一實體(淺拷貝),修改一處影響全體。
- 回傳新陣列:不修改任何現有變數。
實戰範例與輸出
範例 1:基本用法
<?php
$a = array_fill(2, 3, 'Dog');
print_r($a);
// 輸出:
// Array (
// [2] => Dog
// [3] => Dog
// [4] => Dog
// )
?>
範例 2:負數起始索引
<?php
$b = array_fill(-3, 5, 'test');
print_r($b);
// 輸出:
// Array (
// [-3] => test
// [-2] => test
// [-1] => test
// [0] => test
// [1] => test
// )
?>
範例 3:填充物件(淺拷貝陷阱)
<?php
class Counter { public $n = 0; }
$obj = new Counter();
$arr = array_fill(0, 3, $obj); // 三個元素指向同一物件
$arr[0]->n = 10;
print_r($arr[2]->n); // 輸出 10(非預期)
// 正確做法:使用匿名函式產生獨立實體
$arr = array_map(fn() => new Counter(), range(0, 2));
$arr[0]->n = 10;
print_r($arr[2]->n); // 輸出 0(獨立)
?>
範例 4:建立預設配置陣列
<?php
// 產生 10 個預設分頁大小為 20 的配置項
$pageConfigs = array_fill(1, 10, ['per_page' => 20, 'sort' => 'desc']);
// 注意:上述同樣面臨淺拷貝問題,實務上建議:
$pageConfigs = array_map(
fn($i) => ['id' => $i, 'per_page' => 20, 'sort' => 'desc'],
range(1, 10)
);
?>
常見錯誤與避坑
| 錯誤代碼 | 原因 | 修正 |
ValueError: Count must be positive | $count <= 0 | 確保 $count >= 1 |
| 所有元素同步變更 | 填充物件/陣列為淺拷貝 | 改用 array_map() 或迴圈 new 實體 |
| 索引非預期 | 誤以為支援字串鍵 | 需字串鍵請用 array_fill_keys() |
相關函式快速對照
| 函式 | 用途 | 鍵名類型 | 值來源 |
array_fill() | 固定值重複 | 數值遞增 | 單一值 |
array_fill_keys() | 指定鍵名填值 | 自定陣列 | 單一值 |
range() | 數值/字串序列 | 數值遞增 | 序列本身 |
array_map() | 動態產生值 | 保留原鍵/重新索引 | 回調函式 |
array_fill() 以極簡語法解決固定值重複填充需求,配合 array_map() 可彈性處理物件獨立實體化,是陣列初始化工具箱中的核心成員。