Menu

PHP array_slice():截取数组的一部分

array_slice($array, $offset, $length) 返回数组一部分的副本,不会修改原数组。学习用负数偏移量获取最后几项、preserve_keys、对列表分页,以及它和 array_splice 的区别。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

array_slice($array, $offset, $length) 返回一个新数组,包含从位置 $offset 开始的 $length 个元素。原数组不会改变。省略 $length 就会一直取到末尾。

偏移量是位置(0 是第一个元素),而不是键。对于关联数组,以及键不是 0, 1, 2 的数组,这一点很重要。

用负数偏移量获取最后 N 个元素

负数偏移量从末尾开始计数:-1 是最后一个元素,-3 从倒数第三个开始。负数长度表示在距离末尾这么多个元素的地方停下。

请求的元素比实际存在的多也没关系:array_slice($log, 0, 100) 会返回全部五个元素。

用 preserve_keys 保留原来的键

除非把 true 作为第四个参数传入,否则整数键会从 0 开始重新编号。字符串键则总是会保留。

当键有实际含义时(比如数据库 id),并且之后还要用它们查找元素,就传入 true。

用 array_slice 对数组分页

每页显示 $perPage 项,要显示列表的第 $page 页,只需要截取一次:偏移量是 ($page - 1) * $perPage。下面的例子输出一个带有页码链接的 HTML 列表。运行它并点击一个页码:同一个脚本会再次运行,$_GET['page'] 的值来自那个链接。

max(1, min($pages, ...)) 这一行会把手动输入的 ?page=99 或 ?page=-1 限制在有效范围内。如果用的是数据库,你会用 LIMIT 和 OFFSET 只查询一页,而不是加载所有行;但对于已经在内存中的列表,array_slice 就能完成全部工作。

array_slice 与 array_splice

这两个名字只差一个字母,对原数组做的事情却完全相反。array_slice 把一部分复制出来。array_splice 则把这一部分从你传入的数组中剪掉,重新编号,并返回被删除的元素。它还可以在剪掉的位置插入替换的元素。

array_slicearray_splice
修改原数组否是(按引用)
返回选中的部分被删除的部分
可以插入元素否可以,通过第四个参数
整数键重新编号,除非使用 preserve_keys重新编号

更多删除元素的方法,请看从数组中删除元素。

把数组分成若干块

当你一次需要所有页时,比如要把商品按每行三个排列,array_chunk 会替你完成重复的截取工作。

把 3 改成 2 或 4 再运行一次。最后一块包含剩下的所有元素。

常见问题

PHP 中怎样获取数组的前 N 个元素?

array_slice($arr, 0, 3) 返回前三个元素。如果数组不足三个元素,你会得到全部元素,而且不会报错。

怎样获取数组的最后 N 个元素?

使用负数偏移量:array_slice($arr, -3) 返回最后三个元素。省略长度参数表示“一直到末尾”。

array_slice 中的 preserve_keys 有什么作用?

默认情况下,array_slice 会把整数键从 0 开始重新编号。把 true 作为第四个参数传入,即 array_slice($arr, 2, 3, true),就能保留原来的整数键。字符串键无论是否传入都会保留。

array_slice 和 array_splice 有什么区别?

array_slice 返回数组一部分的副本,不改动原数组。array_splice 按引用接收数组,从中删除这一部分(还可以插入替换的元素),并返回被删除的内容。

Coddy 编程语言插图

和 Coddy 一起学编程

开始