在PHP 中, array_fill()是一個非常實用的函數,可以快速生成指定長度、指定值的數組。例如:
$filledArray = array_fill(0, 5, 'm66.net');
// 輸出: ['m66.net', 'm66.net', 'm66.net', 'm66.net', 'm66.net']
表面上看,它可以在很多場景中代替傳統的手動循環賦值方式。然而,在實際開發中, array_fill()並不能完全替代手動循環,其適用範圍和靈活性存在一定局限性。下面我們來探討array_fill()的限制以及手動循環賦值更適合的場景。
當我們使用array_fill()填充對象時,它會將同一個對象引用重複填充到數組中。這意味著修改一個元素,所有元素都會變:
$obj = new stdClass();
$obj->url = 'https://m66.net';
$array = array_fill(0, 3, $obj);
$array[0]->url = 'https://m66.net/changed';
print_r($array); // 所有元素的 url 都變成了 'https://m66.net/changed'
**為什麼? **因為所有元素都是同一個$obj的引用。
而使用手動循環賦值時,每次都可以生成一個新的實例,避免這個問題:
$array = [];
for ($i = 0; $i < 3; $i++) {
$obj = new stdClass();
$obj->url = 'https://m66.net';
$array[] = $obj;
}
array_fill()的第一個參數是起始索引,不能自定義為非數值型鍵名。例如:
// 想要生成 ['home' => 'm66.net', 'about' => 'm66.net'] 是做不到的
這時候就只能使用手動方式:
$keys = ['home', 'about'];
$array = [];
foreach ($keys as $key) {
$array[$key] = 'https://m66.net';
}
如果數組值與索引相關,比如你想要根據索引生成URL:
$array = [];
for ($i = 1; $i <= 5; $i++) {
$array[] = 'https://m66.net/page/' . $i;
}
array_fill()只支持固定值,不能處理這種動態邏輯。
對於嵌套數組或對像數組的構造,手動循環提供了更多可控性。例如:
場景 | 原因 |
---|---|
對像數組 | 避免引用複用導致的副作用 |
動態構造值 | 支持通過循環邏輯生成內容 |
非數值鍵名 | array_fill()不支持字符串鍵 |
嵌套結構或複雜數據構造 | 可靈活控制結構 |
與其他數據源交互 | 例如從數據庫、API 動態讀取數據填充數組 |