PHP Conference Japan 2024

array_slice

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

array_slice提取数组的一部分

描述

array_slice(
    数组 $array,
    整数 $offset,
    ?整数 $length = null,
    布尔值 $preserve_keys = false
): 数组

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

参数

array

输入数组。

offset

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

如果 offset 为负数,则序列将从 array 结尾处向前回溯该偏移量开始。

注意:

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

length

如果提供了 length 且为正数,则序列最多包含该数量的元素。

如果数组长度小于 length,则仅包含可用的数组元素。

如果提供了 length 且为负数,则序列将在数组结尾处向前回溯该偏移量结束。

如果省略,则序列将包含从 offsetarray 结尾的所有元素。

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
)

参见

添加注释

用户贡献的注释 17 条注释

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

function array_slice_assoc($array,$keys) {
return array_intersect_key($array,array_flip($keys));
}
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']);

将返回

数组 (
'name' = 'Nathan',
'age' = 20
)



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

将返回

数组 (
'age' = 20,
'height' = 6
)
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;
}
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; // 只有在没有找到目标值时才返回 holding 数组
}
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)
developer at i-space dot org
22 年前
请记住,array_slice 返回一个包含当前元素的数组。如果要获取后续元素,则必须使用 array_slice($array, $index+1)。
s0i0m at dreamevilconcepts dot com
16 年前
使用 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 的论坛以获取更多创新作品!
Benjamin Sonntag
1 年前
文档中没有说明,但如果 LENGTH 为零,则结果为空数组 []。
kansey
9 年前
为了保存数组中数字索引的排序顺序。PHP 版本 => 5.5.26
/*
示例
*/

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

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

/*
结果

数组
(
[2] => 3
[3] => 5
)
*/
andreasblixt (at) msn (dot) com
19 年前
<?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));
}
?>
匿名用户
18 年前
如果指定第四个参数(不重新分配键),则似乎无法使函数将所有值返回到数组的末尾。分配 -0 或 NULL 或连续使用两个逗号都不会返回任何结果。
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>';
/** 示例结束 **/
?>
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')
Mr. P
16 年前
请注意,偏移量与键不同。偏移量始终从 0 开始,而键可以是任何数字。

所以这个

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

将产生以下结果
数组
(
[0] => 5
[1] => 13
)
aexchecker at yahoo dot com
17 年前
<?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 [optional] $offset 偏移量
* @param int [optional] $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)
);
}
?>
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;
}

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

array_slice($array, $my_offset, NULL, true);
To Top