array_slice

(PHP 4, PHP 5, PHP 7, PHP 8)

array_slice提取数组的一部分

描述

array_slice(
    array $array,
    int $offset,
    ?int $length = null,
    bool $preserve_keys = false
): array

array_slice() 返回从 array 数组中提取的元素序列,由 offsetlength 参数指定。

参数

array

输入数组。

offset

如果 offset 为非负数,则序列将从 array 数组中的该偏移量开始。

如果 offset 为负数,则序列将从数组末尾的该位置开始。

注意:

offset 参数表示数组中的位置,而不是键值。

length

如果 length 被给出并且为正数,则序列中将包含最多该数量的元素。

如果数组比 length 短,则只包含可用的数组元素。

如果 length 被给出并且为负数,则序列将从数组末尾的该数量元素处停止。

如果省略,则序列将包含从 offset 到数组末尾的所有内容。

preserve_keys

注意:

array_slice() 默认情况下会重新排序并重置整型数组索引。可以通过将 preserve_keys 设置为 true 来更改此行为。字符串键始终保留,无论此参数如何。

返回值

返回切片。如果偏移量大于数组的大小,则返回一个空数组。

示例

示例 #1 array_slice() 示例

<?php
$input
= array("a", "b", "c", "d", "e");

$output = array_slice($input, 2); // 返回 "c", "d", 和 "e"
$output = array_slice($input, -2, 1); // 返回 "d"
$output = array_slice($input, 0, 3); // 返回 "a", "b", 和 "c"

// 注意数组键值的不同
print_r(array_slice($input, 2, -1));
print_r(array_slice($input, 2, -1, true));
?>

以上示例将输出

Array
(
    [0] => c
    [1] => d
)
Array
(
    [2] => c
    [3] => d
)

示例 #2 array_slice() 和一维数组

<?php
$input
= array(1 => "a", "b", "c", "d", "e");
print_r(array_slice($input, 1, 2));
?>

以上示例将输出

Array
(
    [0] => b
    [1] => c
)

示例 #3 array_slice() 和包含混合键的数组

<?php
$ar
= array('a'=>'apple', 'b'=>'banana', '42'=>'pear', 'd'=>'orange');
print_r(array_slice($ar, 0, 3));
print_r(array_slice($ar, 0, 3, true));
?>

以上示例将输出

Array
(
    [a] => apple
    [b] => banana
    [0] => pear
)
Array
(
    [a] => apple
    [b] => banana
    [42] => pear
)

参见

添加注释

用户贡献注释 20 个注释

51
taylorbarstow at the google mail service
18 年前
适用于关联数组(键值)的数组切片函数

function array_slice_assoc($array,$keys) {
return array_intersect_key($array,array_flip($keys));
}
19
Ray.Paseur often uses Gmail
11 年前
<?php
// 从数组开头截取 $num 个元素
// 返回截取部分,缩短主体数组
function array_chop(&$arr, $num)
{
$ret = array_slice($arr, 0, $num);
$arr = array_slice($arr, $num);
return
$ret;
}
5
nathan dot fiscaletti at gmail dot com
6 年前
如果您想要此函数的关联版本,可以执行以下操作

function array_slice_assoc($array,$keys) {
return array_intersect_key($array,array_flip($keys));
}

但是,如果您想要此函数的逆向关联版本,只需使用 array_diff_key 而不是 array_intersect_key。

function array_slice_assoc_inverse($array,$keys) {
return array_diff_key($array,array_flip($keys));
}

示例

$arr = [
'name' => 'Nathan',
'age' => 20,
'height' => 6
];

array_slice_assoc($arr, ['name','age']);

将返回

Array (
'name' = 'Nathan',
'age' = 20
)



array_slice_assoc_inverse($arr, ['name']);

将返回

Array (
'age' = 20,
'height' = 6
)
4
ted.devito at 9gmail9 dot 99com
16 年前
基于 worldclimb 的 arem() 函数,这里提供了一个可以处理多维数组的递归数组值移除工具。

function remove_from_array($array,$value){
$clear = true;
$holding=array();

foreach($array as $k => $v){
if (is_array($v)) {
$holding [$k] = remove_from_array ($v, $value);
}
elseif ($value == $v) {
$clear = false;
}
elseif($value != $v){
$holding[$k]=$v; // 通过顺序遍历数组并保存有效数据来移除元素
}
}
if ($clear) return $holding; // 如果没有找到值,只返回保存的数组
}
1
Benjamin Sonntag
10 个月前
文档中没有说明,但如果 LENGTH 为零,则结果为空数组 []。
12
worldclimb at 99gmail99 dot com
16 年前
array_slice 可用于从数组中移除元素,但使用自定义函数也比较简单。

有一天,array_remove() 可能会成为 PHP 的一部分,并且很可能成为保留的函数名,因此这个函数的名称选择并不明显。

<?
function arem($array,$value){
$holding=array();
foreach($array as $k => $v){
if($value!=$v){
$holding[$k]=$v;
}
}
return $holding;
}

function akrem($array,$key){
$holding=array();
foreach($array as $k => $v){
if($key!=$k){
$holding[$k]=$v;
}
}
return $holding;
}

$lunch = array('sandwich' => 'cheese', 'cookie'=>'oatmeal','drink' => 'tea','fruit' => 'apple');
echo '<pre>';
print_r($lunch);
$lunch=arem($lunch,'apple');
print_r($lunch);
$lunch=akrem($lunch,'sandwich');
print_r($lunch);
echo '</pre>';
?>

(移除电子邮件中的 9)
10
developer at i-space dot org
22 年前
记住 array_slice 返回包含当前元素的数组。如果你想获取后面的元素,则必须使用 array_slice($array, $index+1)。
7
s0i0m at dreamevilconcepts dot com
15 年前
使用 array_search 页面中引用的 varname 函数(由 dcez at land dot ru 提交)。我创建了一个多维数组切片函数。它的用法如下:

$array['admin'] = array('blah1', 'blah2');
$array['voice'] = array('blah3', 'blah4');
array_cut('blah4', $array);

... 将从数组中移除 blah4,无论它在数组中的位置,并返回以下结果...

Array ( [admin] => Array ( [0] => blah1 [1] => blah2 ) [voice] => Array ( [0] => blah3 ) )

以下是代码...

<?php

function varname ($var)
{
// varname 函数由 dcez at land dot ru 提交
return (isset($var)) ? array_search($var, $GLOBALS) : false;
}

function
array_cut($needle, $haystack)
{
foreach (
$haystack as $k => $v)
{
for (
$i=0; $i<count($v); $i++)
if (
$v[$i] === $needle)
{
return
array_splice($GLOBALS[varname($haystack)][$k], $i, 1);
break; break;
}
}

?>

查看 dreamevilconcept 的论坛以获取更多创新作品!
1
kansey
9 年前
为了保留数组中数字索引的排序顺序。PHP 版本 => 5.5.26
/*
示例
*/

$arr = array( "1" =>2, "2" =>3 , "3" =>5 );

print_r(array_slice($arr,1,null,true));

/*
结果

Array
(
[2] => 3
[3] => 5
)
*/
0
andreasblixt (at) msn (dot) com
18 年前
<?php
// 将一个数组插入另一个数组的指定位置,然后返回结果
function array_insert($src, $dest, $pos) {
if (!
is_array($src) || !is_array($dest) || $pos <= 0) return FALSE;
return
array_merge(array_slice($dest, 0, $pos), $src, array_slice($dest, $pos));
}
?>
-1
xananax at yelostudio dot com
13 年前
<?php
/**
* 根据值的列表对数组进行按键重新排序。
* @param array $array 要重新排序的数组。按引用传递
* @param array $list 按此列表重新排序
* @param boolean $keepRest 如果设置为 FALSE,则会移除 $list 数组中不存在的任何内容。
* @param boolean $prepend 如果设置为 TRUE,则会将剩余的值添加到开头而不是结尾
* @author xananax AT yelostudio DOT com
*/
function array_reorder(array &$array,array $list,$keepRest=TRUE,$prepend=FALSE,$preserveKeys=TRUE){
$temp = array();
foreach(
$list as $i){
if(isset(
$array[$i])){
$tempValue = array_slice(
$array,
array_search($i,array_keys($array)),
1,
$preserveKeys
);
$temp[$i] = array_shift($tempValue);
unset(
$array[$i]);
}
}
$array = $keepRest ?
(
$prepend?
$array+$temp
:$temp+$array
)
:
$temp;
}

/** 示例 ** /
$a = array(
'a' => 'a',
'b' => 'b',
'c' => 'c',
'd' => 'd',
'e' => 'e'
);
$order = array('c','b','a');

array_reorder($a,$order,TRUE);
echo '<pre>';
print_r($a);
echo '</pre>';
/** 示例结束 **/
?>
-1
匿名
18 年前
如果你指定第四个参数(不重新分配键),那么似乎无法让函数将所有值返回到数组的末尾。分配 -0 或 NULL,或者只是连续输入两个逗号都不会返回任何结果。
-3
aexchecker at yahoo dot com
16 年前
<?php
/**
* @desc
* 将一个数组插入到另一个数组的指定位置,并返回结果数组。
*
* @since 2007/10/04
* @version v0.7 2007/10/04 18:47:52
* @author AexChecker <[email protected]>
* @param array $source
* @param array $destination
* @param int [可选] $offset
* @param int [可选] $length
* @return array
*/
function array_insert($source, $destination, $offset = NULL, $length = NULL) {
if (!
is_array($source) || empty($source)) {
if (
is_array($destination) && !empty($destination)) {
return
$destination;
}
return array();
}
if (
is_null($offset)) {
return
array_merge($destination, $source);
}
$offset = var2int($offset);
if (
is_null($length)) {
if (
$offset === 0) {
return
array_merge($source, array_slice($destination, 1));
}
if (
$offset === -1) {
return
array_merge(array_slice($destination, 0, -1), $source);
}
return
array_merge(
array_slice($destination, 0, $offset),
$source,
array_slice($destination, ++$offset)
);
}
if (
$offset === 0) {
return
array_merge($source, array_slice($destination, $length));
}
$destination_count = count($destination);
$length = var2int($length);
if (
$offset > 0) {
if (
$destination_count - $offset < 1) {
return
array_merge($destination, $source);
}
} else{
if ((
$t = $destination_count + $offset) < 1) {
return
array_merge($source, $destination);
}
$offset = $t;
}
if (
$length > 0) {
$length+= $offset;
} elseif (
$length < 0 && !($length * -1 < $destination_count)) {
return
$source;
} else {
$length = $offset;
}
return
array_merge(
array_slice($destination, 0, $offset),
$source,
array_slice($destination, $length)
);
}
?>
-3
aflavio at gmail dot com
17年前
/**
* 从数组中删除一个值
* @param string $val
* @param array $arr
* @return array $array_remval
*/
function array_remval($val, &$arr)
{
$array_remval = $arr;
for($x=0;$x<count($array_remval);$x++)
{
$i=array_search($val,$array_remval);
if (is_numeric($i)) {
$array_temp = array_slice($array_remval, 0, $i );
$array_temp2 = array_slice($array_remval, $i+1, count($array_remval)-1 );
$array_remval = array_merge($array_temp, $array_temp2);
}
}
return $array_remval;
}

$stack=Array('apple','banana','pear','apple', 'cherry', 'apple');
array_remval("apple", $stack);

// 输出:Array('banana','pear', 'cherry')
-2
bishop
19年前
有时你需要从数组中提取某些非整数或非连续的键。考虑使用下面的 array_pick() 实现来从源数组中提取特定的键,并按照指定的顺序。

<?php

$a
= array ('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4);
$b = array_pick($a, array ('d', 'b'));

// 现在:
// $a = array ('a' => 1, 'c' => '3');
// $b = array ('d' => 4, 'b' => '2');

function &array_pick(&$array, $keys)
{
if (!
is_array($array)) {
trigger_error('第一个参数必须是数组', E_USER_ERROR);
return
false;
}

if (! (
is_array($keys) || is_scalar($keys))) {
trigger_error('第二个参数必须是键数组或标量键', E_USER_ERROR);
return
false;
}

if (
is_array($keys)) {
// 无需操作
} else if (is_scalar($keys)) {
$keys = array ($keys);
}

$resultArray = array ();
foreach (
$keys as $key) {
if (
is_scalar($key)) {
if (
array_key_exists($key, $array)) {
$resultArray[$key] = $array[$key];
unset(
$array[$key]);
}
} else {
trigger_error('提供的键不是标量', E_USER_ERROR);
return
false;
}
}

return
$resultArray;
}

?>
-3
Mr. P
15 年前
请注意,偏移量与键不同。偏移量总是从 0 开始,而键可以是任何数字。

所以,

<?php print_r(array_slice(array(0 => 0, 5 => 5, 13 => 13),1)); ?>

将产生如下结果
Array
(
[0] => 5
[1] => 13
)
-5
Nathan - thefiscster510 at gmail dot com
13 年前
如果你想从数组中删除指定条目,我创建了这个方法...

<?php
$array
= array("Entry1","entry2","entry3");

$int = 3; // 数组中的条目数量
$int2 = 0; // 数组起始位置... 它将从 0 开始搜索。
$del_num = 1; // 代表数组中的第二个条目... 我们将在这次中删除它... 例如 0 = 第一个条目,1 = 第二个条目,2 = 第三个...

$newarray = array(); // 空数组,将成为删除指定条目后的新数组。
print_r($array) . "<br>"; // 打印原始数组内容
print_r($newarray). "<br>"; // 打印新的空数组

do
{
$user = $array[$int2];
$key = array_search($user, $array);
if (
$key == $del_num)
{

}
else
{
$newarray[] = $array[$int2];
}

$int2 = $int2 + 1;
} while (
$int2 < $int);

print_r($newarray). "<br>"; // 打印新的数组

?>
-5
delew
13 年前
一个小技巧。
要保留键而不提供长度:使用 NULL

array_slice($array, $my_offset, NULL, true);
-8
jamon at clearsightdesign dot com
15 年前
我试图找到一个好方法,从 MySQL 查询中创建的数组中查找前几个和后几个结果。我发现大多数 MySQL 解决方案都比较复杂。这里有一个简单的函数,可以返回数组中的前几行和后几行。

<?php

/*
** 函数 array_surround 由 ClearSight Design 的 Jamon Holmgren 创建
** 版本 1.0 - 2009 年 4 月 10 日
** 请将评论和问题发送到我的名字在符号 clearsightdesign.com
**
** 返回一个仅包含 $before 和 $after 个结果的数组
** 此函数针对 MySQL 数据结果进行了优化
** 使用此函数查找特定行之前和之后的行,数量可自定义
**
** 使用示例:
** $mysql_ar 是 MySQL 查询结果的数组,当前 ID 为 $cur_id
** 我们想获取此行之前的行以及之后的五行
**
** $near_rows = array_surround($mysql_ar, "id", $cur_id, 1, 5)
**
** 现在,前一行是 $near_rows[-1]
** 现在,当前行是 $near_rows[0]
** 现在,下一行是 $near_rows[1] ...等等
** 如果没有前一行,则不会设置 $near_rows[-1]...使用 is_array($near_rows[-1]) 进行测试
**
*/
function array_surround($src_array, $field, $value, $before = 1, $after = 1) {
if(
is_array($src_array)) {
// 重置所有键,以防它们不是顺序的
$new_array = array_values($src_array);
// 现在循环查找数组中与 $field 和 $value 中条件匹配的键
foreach($new_array as $k => $s) {
if(
$s[$field] == $value) {
// 找到了我们想要的那一个
$ck = $k; // 将键放入 $ck(当前键)中
break;
}
}
if(isset(
$ck)) { // 找到了!
$result_start = $ck - $before; // 设置起始键
$result_length = $before + 1 + $after; // 设置要返回的键的数量
if($result_start < 0) { // 哎呀,起始键位于第一个结果之前
$result_length = $result_length + $result_start; // 减少要返回的键的数量
$result_start = 0; // 将起始键设置为第一个结果
}
$result_temp = array_slice($new_array, $result_start, $result_length); // 切片出我们想要的结果
// 现在我们得到了一个数组,但我们想要 array[-$before] 到 array[$after],而不是 0 到其他任何值。
foreach($result_temp as $rk => $rt) { // 将所有键设置为 -$before 到 +$after
$result[$result_start - $ck + $rk] = $rt;
}
return
$result;
} else {
// 没有找到!
return false;
}
} else {
// 他们没有发送数组
return false;
}
}

?>

希望您发现这个函数有用!欢迎您提出建设性的批评或评论,当然也欢迎赞美 ;) -- 只需给我发邮件。

- Jamon Holmgren
-5
SomeGuy
8 年前
感谢 taylorbarstow,这里提供具有 unset 功能的函数。
<?php
function array_slice_assoc(&$array,$keys,$unset = true) {
$return = array_intersect_key($array, array_flip($keys));
if (
$unset) {
foreach (
$keys as $value) {
unset(
$array[$value]);
}
}
return
$return;
}
?>
To Top