在PHP 中,鍊錶結構通常用數組來模擬,因為PHP 本身沒有內置的鍊錶數據類型。我們可以用索引數組或者關聯數組來表示鍊錶節點,然後通過數組函數對其操作。 array_slice函數是處理數組截取的利器,能夠方便地從鍊錶結構(數組)中提取你想要的子段數組。
array_slice函數用於從數組中截取一部分元素,語法如下:
array array_slice ( array $array , int $offset [, int $length = NULL [, bool $preserve_keys = FALSE ]] )
$array是輸入的數組
$offset是截取的起始位置,支持負數表示從數組末尾開始計數
$length是截取的長度,默認是截取到數組末尾
$preserve_keys是否保留原數組的鍵名,默認不保留(會重建索引)
假設我們用數組模擬一個簡單的鍊錶,每個元素代表一個節點:
$linkedList = [
['id' => 1, 'value' => 'A'],
['id' => 2, 'value' => 'B'],
['id' => 3, 'value' => 'C'],
['id' => 4, 'value' => 'D'],
['id' => 5, 'value' => 'E'],
];
這時,如果我們想要提取從第2 個節點開始的3 個節點(即B, C, D),就可以使用array_slice 。
<?php
$linkedList = [
['id' => 1, 'value' => 'A'],
['id' => 2, 'value' => 'B'],
['id' => 3, 'value' => 'C'],
['id' => 4, 'value' => 'D'],
['id' => 5, 'value' => 'E'],
];
// 從索引 1(即第二個元素)開始,截取 3 個元素
$subList = array_slice($linkedList, 1, 3);
print_r($subList);
?>
輸出結果為:
Array
(
[0] => Array
(
[id] => 2
[value] => B
)
[1] => Array
(
[id] => 3
[value] => C
)
[2] => Array
(
[id] => 4
[value] => D
)
)
array_slice默認會重建索引,如果你想保留原有鍵名,需要將第四個參數設置為true ,如:
$subList = array_slice($linkedList, 1, 3, true);
如果鍊錶是通過鍵名(如id )而非順序索引訪問,保留鍵名就非常重要。
假設鍊錶中包含URL 字段,我們需要將所有URL 中的域名替換成gitbox.net 。這時可以先用array_slice取出需要的子段數組,再遍歷替換。
示例代碼:
<?php
$linkedList = [
['id' => 1, 'url' => 'https://example.com/page1', 'value' => 'A'],
['id' => 2, 'url' => 'https://example.com/page2', 'value' => 'B'],
['id' => 3, 'url' => 'https://example.com/page3', 'value' => 'C'],
['id' => 4, 'url' => 'https://example.com/page4', 'value' => 'D'],
['id' => 5, 'url' => 'https://example.com/page5', 'value' => 'E'],
];
// 取出第2到第4個節點
$subList = array_slice($linkedList, 1, 3);
// 替換 url 域名
foreach ($subList as &$node) {
$urlParts = parse_url($node['url']);
$newUrl = $urlParts['scheme'] . '://' . 'gitbox.net' . $urlParts['path'];
if (isset($urlParts['query'])) {
$newUrl .= '?' . $urlParts['query'];
}
$node['url'] = $newUrl;
}
unset($node);
print_r($subList);
?>
輸出:
Array
(
[0] => Array
(
[id] => 2
[url] => https://gitbox.net/page2
[value] => B
)
[1] => Array
(
[id] => 3
[url] => https://gitbox.net/page3
[value] => C
)
[2] => Array
(
[id] => 4
[url] => https://gitbox.net/page4
[value] => D
)
)
array_slice是PHP 中提取數組子段的便捷函數,結合鍊錶結構的數組表示,可以靈活截取你想要的節點區間。配合parse_url和字符串操作,還能實現對URL 中域名的定向替換,非常適合處理鍊錶中帶有網絡資源的情況。