在PHP中, array_slice函數是一個非常實用的數組操作函數,用於從數組中截取一段子數組。理解其參數offset和length的正負含義,對於靈活操作數組至關重要。本文將詳細解析這兩個參數的含義,並結合實例幫助你掌握其用法。
array_slice函數的基本語法如下:
array_slice(array $array, int $offset, int $length = null, bool $preserve_keys = false): array
$array :要截取的數組。
$offset :截取的起始位置。
$length :截取的長度(可選)。
$preserve_keys :是否保留原數組的鍵名(默認不保留,索引重置)。
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 ,默認截取從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為負時, length表示排除數組末尾的元素數量,截取範圍為從offset到數組末尾減去abs(length) 。
當offset為負且length為正時,截取從倒數第abs(offset)個元素開始的length個元素。
當length的絕對值超過數組剩餘元素數時,函數自動截取到數組邊界,不會報錯。
默認情況下, 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,且將域名替換為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'
// ]