当前位置: 首页> 最新文章列表> 用 array_slice 获取链表结构中的子段数组

用 array_slice 获取链表结构中的子段数组

gitbox 2025-05-26

在 PHP 中,链表结构通常用数组来模拟,因为 PHP 本身没有内置的链表数据类型。我们可以用索引数组或者关联数组来表示链表节点,然后通过数组函数对其操作。array_slice 函数是处理数组截取的利器,能够方便地从链表结构(数组)中提取你想要的子段数组。

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 字段,我们需要将所有 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 中域名的定向替换,非常适合处理链表中带有网络资源的情况。