在 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 中域名的定向替换,非常适合处理链表中带有网络资源的情况。