array_slice(取出切片)與 array_splice(移除並可替換切片)是 PHP 陣列操作核心函式,底層均在 ext/standard/array.c 實現。本文解析參數處理、指標移動、記憶體分配、返回值最佳化等關鍵邏輯。
array_slice(array $array, int $offset, int $length = null, bool $preserve_keys = false): array array_splice(array &$array, int $offset, int $length = null, mixed $replacement = []): array
offset >= 0 直接使用;offset > n 視為 n(返回空)。offset < 0 轉為 n + offset;若結果 < 0 則歸零。length < 0 轉為 n - offset + length(從末尾倒數)。offset + length > n 則截為 n - offset。length < 0 直接返回空。offset 位置。length 個元素至新陣列(preserve_keys=true 保留原數字鍵,否則重新索引 0...)。array_slice)。return_value_used),避免無用記憶體分配。offset 起 length 個元素。$replacement,將其元素插入移除位置。if (return_value_used) {
int size = length;
// ... 計算實際 size ...
array_init_size(return_value, size > 0 ? size : 0);
rem_hash = &Z_ARRVAL_P(return_value);
}
這是 C 層級的「惰性求值」優化:$removed = array_splice(...) 才建立返回陣列;單純 array_splice(...) 不產生返回值開銷。
$arr = ['a','b','c','d','e']; print_r(array_slice($arr, 2, -1)); // ['c','d'] 保留鍵 0,1 print_r(array_slice($arr, 2, -1, true)); // ['c','d'] 保留原鍵 2,3 $arr = ['red','green','blue','yellow']; array_splice($arr, 2); // $arr=['red','green'] 返回 ['blue','yellow'] array_splice($arr, 1, -1); // $arr=['red','yellow'] 返回 ['green','blue'] array_splice($arr, 1, count($arr), 'orange'); // $arr=['red','orange'] array_splice($arr, -1, 1, ['black','maroon']); // 替換最後一元素 array_splice($arr, 3, 0, 'purple'); // 在索引 3 插入,不移除
array_slice 複製資料,記憶體翻倍;若只需迭代部分區間,考慮 ArrayIterator + LimitIterator 零拷貝。O(n);高頻場景改用 SplDoublyLinkedList。preserve_keys=true 適用關聯陣列;索引陣列預設重建索引更符合直覺。理解參數正規化規則、preserve_keys 行為差異、array_splice 的副作用(修改原陣列)與返回值按需分配優化,能寫出更健壯、高效的陣列操作代碼。