前置知识
<?php
/**
* array_splice — 去掉数组中的某一部分并用其它值取代
* array array_splice ( array &$input , int $offset [, int $length = count($input) [, mixed $replacement = array() ]] )
* 把 input 数组中由 offset 和 length 指定的单元去掉,如果提供了 replacement 参数,则用其中的单元取代
* 注意 input 中的数字键名不被保留
* Note: 如果 replacement 不是数组,会被 类型转换 成数组 (例如: (array) $replacement)
* 当传入的 replacement 是个对象或者 NULL,会导致未知的行为出现
* $input 输入的数组
* $offset 如果 offset 为正,则从 input 数组中该值指定的偏移量开始移除。
* 如果 offset 为负,则从 input 末尾倒数该值指定的偏移量开始移除
* $length 如果省略 length,则移除数组中从 offset 到结尾的所有部分。
* 如果指定了 length 并且为正值,则移除这么多单元。
* 如果指定了 length 并且为负值,则移除从 offset 到数组末尾倒数 length 为止中间所有的单元。
* 如果设置了 length 为零,不会移除单元。
* 小窍门:当给出了 replacement 时要移除从 offset 到数组末尾所有单元时,用 count($input) 作为 length。
* $replacement 如果给出了 replacement 数组,则被移除的单元被此数组中的单元替代。
* 如果 offset 和 length 的组合结果是不会移除任何值,
* 则 replacement 数组中的单元将被插入到 offset 指定的位置。 注意替换数组中的键名不保留。
* 如果用来替换 replacement 只有一个单元,那么不需要给它加上 array(),
* 除非该单元本身就是一个数组、一个对象或者 NULL。
*/
$arrs = [1,2,3,4,5,6];
array_splice($arrs,2);
print_r($arrs);//Array ( [0] => 1 [1] => 2 )
echo "<hr>";
$arrs = [1,2,3,4,5,6];
array_splice($arrs,-2);
print_r($arrs);//Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
echo "<hr>";
$arrs = [1,2,3,4,5,6];
array_splice($arrs,2,3);
print_r($arrs);//Array ( [0] => 1 [1] => 2 [2] => 6 )
echo "<hr>";
$arrs = [1,2,3,4,5,6];
array_splice($arrs,2,-3);
print_r($arrs);//Array ( [0] => 1 [1] => 2 [2] => 4 [3] => 5 [4] => 6 )
echo "<hr>";
$arrs = [1,2,3,4,5,6];
array_splice($arrs,2,-3,1000);
print_r($arrs);//Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 )
echo "<hr>";
$arrs = [1,2,3,4,5,6];
array_splice($arrs,2,-4,1000);
print_r($arrs);//Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 3 [4] => 4 [5] => 5 [6] => 6 )
代码逻辑
<?php
/**
* 数据结构与算法系列(四)
* 在 PHP 中借助数组模拟实现链表结构
* 在 PHP 中由于没有指针,我们可以借助数组的 next、current、key 等函数实现链表这个数据结构
*/
/**
* 通过 PHP 数组模拟实现单链表
*/
class LinkedList
{
private $list = [];
// 获取链表指定位置的元素值,从0开始
public function get($index)
{
$value = NULL;
//current() 函数返回当前被内部指针指向的数组单元的值,并不移动指针。
//如果内部指针指向超出了单元列表的末端,current() 返回 FALSE
while (current($this->list)) {
//key() 函数返回数组中内部指针指向的当前单元的键名。 但它不会移动指针。
//如果内部指针超过了元素列表尾部,或者数组是空的,key() 会返回 NULL
if (key($this->list) == $index) {
$value = current($this->list);
break;
}
//next() 和 current() 的行为类似,只有一点区别,在返回值之前将内部指针向前移动一位。
//这意味着它返回的是下一个数组单元的值并将数组指针向前移动了一位。
next($this->list);
}
//reset() 将 array 的内部指针倒回到第一个单元并返回第一个数组单元的值
reset($this->list);
return $value;
}
// 在链表指定位置插入值,默认插到链表头部
public function add($value, $index = 0)
{
array_splice($this->list, $index, 0, $value);
}
// 从链表指定位置删除元素
public function remove($index)
{
array_splice($this->list, $index, 1);
}
public function isEmpty()
{
return !next($this->list);
}
public function size()
{
return count($this->list);
}
}
$linkedList = new LinkedList();
$linkedList->add(4);
$linkedList->add(5);
$linkedList->add(3);
print $linkedList->get(1); # 输出5
$linkedList->add(1, 1); # 在结点1的位置上插入1
print $linkedList->get(1); # 输出1
$linkedList->remove(1); # 移除结点1上的元素
print $linkedList->get(1); # 输出5
print $linkedList->size(); # 输出3