Contents

PHP的array_slice與array_splice差別

array_slice()array_splice() 這兩個函式很容易混在一起看,因為名字很像、回傳結果也都可能是陣列,但它們的核心差異其實非常重要:一個只是切出片段,一個會直接改動原陣列。

如果這個觀念沒有先分清楚,後面 debug 時很容易出現「我只是取一段資料,怎麼原本陣列也變了」的狀況。

先看函式定義

1
2
array_slice($array, $offset, $length = null, $preserve_keys = false)
array_splice(&$input, $offset, $length = null, $replacement = array())

這裡最關鍵的一點,是 array_splice() 的第一個參數前面有 &,代表它會直接操作原本的陣列。

array_slice() 做什麼

array_slice() 是從陣列中切出一段資料回來,但不會修改原始陣列。

1
2
3
4
5
$arr = [1, 2, 3, 4, 5];
$result = array_slice($arr, 1, 2);

print_r($result); // [2, 3]
print_r($arr);    // [1, 2, 3, 4, 5]

適合用在:

  1. 分頁切片。
  2. 只想取部分資料。
  3. 不希望動到原陣列。

array_splice() 做什麼

array_splice() 除了能取出某段資料,也會把那一段從原陣列移除,甚至可以順便塞入替換內容。

1
2
3
4
5
$arr = [1, 2, 3, 4, 5];
$result = array_splice($arr, 1, 2);

print_r($result); // [2, 3]
print_r($arr);    // [1, 4, 5]

如果再加上 replacement,就更像是「抽掉後換新值」。

和 JavaScript 的對照

這兩個函式和 JavaScript 的概念很像:

  1. array_slice() 類似 JavaScript 的 slice()
  2. array_splice() 類似 JavaScript 的 splice()

所以如果你本來就熟 JavaScript,這樣聯想通常很好記。

常見誤解

1. 兩者只是名稱差一點點

不是。最大的差別就在於會不會影響原陣列。

2. array_splice() 只是進階版 array_slice()

也不完全對。它的用途比較偏向修改資料結構,而不只是讀取片段。

小結

如果你只是想取出部分陣列內容,通常優先用 array_slice();如果你要把某段資料從原陣列移掉或替換掉,才用 array_splice()。把「是否改動原陣列」這個判斷先放在腦中,之後就不太會選錯。