在PHP 開發過程中, array_slice是我們常用的數組操作函數之一。它主要用於從數組中提取一段子數組。然而,當我們用它處理時,如果不注意參數和返回結果的細節,很容易引發意料之外的bug。本文將通過實際示例來揭示這個“坑”,並教你如何正確避開它。
array_slice(array $array, int $offset, ?int $length = null, bool $preserve_keys = false): array
$array :要操作的原始數組
$offset :開始位置
$length :要截取的長度
$preserve_keys :是否保留原數組的鍵名(默認是false ,即重新索引)
來看一個例子:
$data = [
'apple' => 1,
'banana' => 2,
'cherry' => 3,
'date' => 4,
];
$result = array_slice($data, 1, 2);
print_r($result);
你以為會輸出如下內容?
Array
(
[banana] => 2
[cherry] => 3
)
實際上,輸出是這樣的:
Array
(
[0] => 2
[1] => 3
)
為什麼鍵名丟了?原因在於第四個參數$preserve_keys的默認值是false ,所以鍵名被重置成了從0開始的索引鍵。
只需要在調用array_slice時明確指定true給第四個參數:
$result = array_slice($data, 1, 2, true);
print_r($result);
輸出就會如你所願:
Array
(
[banana] => 2
[cherry] => 3
)
這一步很關鍵,尤其是在你依賴數組的鍵名(例如處理表單字段、配置文件等場景)時,忘記這個參數可能會導致邏輯完全錯誤。
比如你用切片結果來構造新的鍵值結構:
foreach (array_slice($data, 1, 2) as $key => $val) {
echo "$key => $val\n";
}
你期待輸出的是:
banana => 2
cherry => 3
但實際輸出是:
0 => 2
1 => 3
這可能會讓你的某些鍵值依賴邏輯完全失敗,特別是當你將$key作為某種標識符使用時。
在你使用array_slice之前,問自己:
是否在乎鍵名? (關聯數組中鍵名一般都很重要)
是否將結果繼續用於與原數組鍵相關的邏輯?
如果答案是“是”,務必設置$preserve_keys = true 。
封裝一個更安全的版本,可以避免重複犯錯:
function slice_assoc(array $array, int $offset, ?int $length = null): array {
return array_slice($array, $offset, $length, true);
}
然後使用:
$result = slice_assoc($data, 1, 2);
清晰、可靠、免出錯。
在很多CMS 和框架中,後台分頁或配置數組處理中都會用到array_slice 。如果不保留鍵,可能會導致錯亂,甚至引發權限校驗漏洞。例如,在對某類配置項做分頁截取時,如果鍵是config_id而被重置為整數索引,那麼對應的配置將無法正常匹配。
更多PHP 函數使用注意事項可以查看https://gitbox.net/php-tips