當前位置: 首頁> 最新文章列表> array_slice 中offset 和length 的正負值含義解析

array_slice 中offset 和length 的正負值含義解析

gitbox 2025-05-28

在PHP中, array_slice函數是一個非常實用的數組操作函數,用於從數組中截取一段子數組。理解其參數offsetlength的正負含義,對於靈活操作數組至關重要。本文將詳細解析這兩個參數的含義,並結合實例幫助你掌握其用法。

array_slice函數簡介

array_slice函數的基本語法如下:

 array_slice(array $array, int $offset, int $length = null, bool $preserve_keys = false): array
  • $array :要截取的數組。

  • $offset :截取的起始位置。

  • $length :截取的長度(可選)。

  • $preserve_keys :是否保留原數組的鍵名(默認不保留,索引重置)。

offset參數詳解

offset參數指定截取起點的位置,可以是正數,也可以是負數。

  • 正數offset :從數組開頭開始計算,0表示第一個元素,1表示第二個元素,以此類推。

  • 負數offset :從數組末尾開始計算,-1表示最後一個元素,-2表示倒數第二個元素,以此類推。

示例:

 $array = ['a', 'b', 'c', 'd', 'e'];

// offset = 2,從第三個元素開始截取
print_r(array_slice($array, 2)); 
// 結果: ['c', 'd', 'e']

// offset = -2,從倒數第二個元素開始截取
print_r(array_slice($array, -2)); 
// 結果: ['d', 'e']

length參數詳解

length參數指定截取的元素個數,也是可以為正負的整數:

  • 正數length :截取指定數量的元素。

  • 負數length :截取到數組末尾前的指定數量元素,即排除結尾的若干元素。

如果省略length ,默認截取從offset開始到數組末尾的所有元素。

示例:

 $array = ['a', 'b', 'c', 'd', 'e'];

// offset = 1, length = 3,截取從第二個元素開始的3個元素
print_r(array_slice($array, 1, 3)); 
// 結果: ['b', 'c', 'd']

// offset = 1, length = -1,截取從第二個元素开始,排除最後一個元素
print_r(array_slice($array, 1, -1)); 
// 結果: ['b', 'c', 'd']

offset和length組合使用的注意點

  • offset為正且length為負時, length表示排除數組末尾的元素數量,截取範圍為從offset到數組末尾減去abs(length)

  • offset為負且length為正時,截取從倒數第abs(offset)個元素開始的length個元素。

  • length的絕對值超過數組剩餘元素數時,函數自動截取到數組邊界,不會報錯。

preserve_keys參數

默認情況下, array_slice返回的數組會重新索引(從0開始)。如果想保留原數組的鍵名,可以將第四個參數設為true

 $array = ['a' => 'apple', 'b' => 'banana', 'c' => 'cherry'];

// 不保留鍵名
print_r(array_slice($array, 1, 2)); 
// 結果: [0 => 'banana', 1 => 'cherry']

// 保留鍵名
print_r(array_slice($array, 1, 2, true)); 
// 結果: ['b' => 'banana', 'c' => 'cherry']

綜合示例

$array = [10, 20, 30, 40, 50, 60];

// 從第2個元素开始截取3個元素
$result1 = array_slice($array, 1, 3);
print_r($result1); 
// 輸出: [20, 30, 40]

// 從倒數第4個元素开始,截取到倒數第2個元素(排除最後1個元素)
$result2 = array_slice($array, -4, -1);
print_r($result2); 
// 輸出: [30, 40, 50]

// 從倒數第3個元素开始,截取2個元素
$result3 = array_slice($array, -3, 2);
print_r($result3); 
// 輸出: [40, 50]

// 從第3個元素开始截取所有元素,保留鍵名
$result4 = array_slice($array, 2, null, true);
print_r($result4);
// 輸出: [2 => 30, 3 => 40, 4 => 50, 5 => 60]

結合URL示例說明

假設我們有一組URL列表,需要截取部分URL,且將域名替換為gitbox.net

 $urls = [
    'https://example.com/page1',
    'https://example.com/page2',
    'https://example.com/page3',
    'https://example.com/page4',
];

// 從第二个URL開始截取兩個
$slicedUrls = array_slice($urls, 1, 2);

// 替換域名
$processedUrls = array_map(function($url) {
    return preg_replace('#https?://[^/]+#', 'https://gitbox.net', $url);
}, $slicedUrls);

print_r($processedUrls);
// 輸出:
// [
//     'https://gitbox.net/page2',
//     'https://gitbox.net/page3'
// ]