array_slice 默认重置键名从0开始,需传true保留原键;负起始位置从末尾计数,负长度表示删末尾元素;拼接应使用array_merge而非+。

array_slice 会重新索引,但不是从 0 开始?
默认情况下 array_slice 确实会重置键名——它返回一个「新数组」,键名从 0 开始连续编号,不管原数组是数字索引还是关联键。这不是 bug,是设计行为。如果你需要保留原始键(比如原数组是 [2 => 'a', 5 => 'b', 8 => 'c']),必须显式传入第四个参数 true。
- 不加
true:返回[0 => 'a', 1 => 'b', 2 => 'c'] - 加
true:返回[2 => 'a', 5 => 'b', 8 => 'c'](仅当截取范围覆盖这些键时) - 注意:即使原数组是纯数字索引(如
[0,1,2,3,4]),加true也会保留数字键,导致结果变成[0=>0, 1=>1, 2=>2]—— 看起来一样,但语义不同(比如用json_encode会输出对象而非数组)
起始位置为负数时,到底从哪开始算?
负数表示从数组末尾往前数。array_slice($arr, -2) 是取最后两个元素;array_slice($arr, -3, 1) 是从倒数第 3 个开始,取 1 个。关键点在于:这个“倒数”是按**当前数组的实际元素顺序和数量**算的,和键名无关。
-
$arr = [10, 20, 30, 40]; array_slice($arr, -2);→[30, 40] -
$arr = [0=>10, 2=>20, 4=>30, 6=>40]; array_slice($arr, -2);→ 还是[30, 40](因为数组有 4 个元素,倒数两个就是最后两个值) - 如果原数组只有 3 个元素,
-5会被当作0处理(不会报错,也不会补空)
长度参数为负数,是删掉末尾还是截断中间?
长度为负数时,array_slice 会从末尾“砍掉”对应数量的元素。比如 array_slice($arr, 0, -1) 等价于去掉最后一个元素;array_slice($arr, 2, -1) 表示从第 2 个(0 起始)开始,到倒数第 1 个之前结束。
-
$arr = ['a','b','c','d']; array_slice($arr, 0, -1);→['a','b','c'] -
array_slice($arr, 1, -2);→['b'](从索引 1 开始,去掉最后 2 个,只剩中间一个) - 如果负长度的绝对值超过剩余元素数(例如
array_slice([1], 0, -5)),结果为空数组[],不是null或 false
截取后要拼回原数组,直接 + 会出问题?
PHP 中数组相加(+)是「键合并」,不是追加。如果截取的是前半段(比如 array_slice($arr, 0, 2)),再用 + 拼接后半段,相同数字键会被覆盖,且顺序不保证。正确做法是用 array_merge,它会重排数字索引。
- 错误:
$a = [0=>'x',1=>'y']; $b = [0=>'m',1=>'n']; $a + $b;→ 还是[0=>'x',1=>'y'] - 正确:
array_merge($a, $b);→[0=>'x',1=>'y',2=>'m',3=>'n'] - 注意:
array_merge对关联键(字符串键)不做重排,只对数字键重编号
实际写的时候,别光看文档里“返回子数组”的描述,重点盯住第四个参数和负数行为——这两处最容易在重构或分页逻辑里悄悄出错。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











