2024 PHP Conference Japan

array_slice

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

array_slice擷取陣列的片段

說明

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

array_slice() 會傳回從陣列 array 中,由 offsetlength 參數指定的元素序列。

參數

array

輸入的陣列。

offset

如果 offset 非負數,則序列將從 array 中的該偏移量開始。

如果 offset 為負數,則序列將從 array 的末尾開始往前數這麼多個元素的位置開始。

注意事項:

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() 以及從 1 開始索引的陣列

<?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 則註解

51
taylorbarstow at the google mail service
18 年前
適用於關聯式陣列(鍵值)的陣列切片函式

function array_slice_assoc($array,$keys) {
return array_intersect_key($array,array_flip($keys));
}
7
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
)
20
Ray.Paseur 經常使用 Gmail
11 年前
<?php
// 從陣列前端移除 $num 個元素
// 返回移除的部分,並縮短原陣列
function array_chop(&$arr, $num)
{
$ret = array_slice($arr, 0, $num);
$arr = array_slice($arr, $num);
return
$ret;
}
5
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 陣列
}
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)
9
developer at i-space dot org
22 年前
請記住,array_slice 會返回包含當前元素的陣列。 如果您想取得後續元素,則必須使用 array_slice($array, $index+1)。
6
s0i0m at dreamevilconcepts dot com
16 年前
使用 array_search 頁面中 dcez at land dot ru 提供的 varname 函式,我建立了一個多維陣列拼接函式。 它的用法如下:

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

...會從陣列中移除 blah4,無論它在陣列中的位置為何 ^^ 返回如下...

陣列 ( [admin] => 陣列 ( [0] => blah1 [1] => blah2 ) [voice] => 陣列 ( [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
Benjamin Sonntag
1 年前
文件中沒有說明,但如果 LENGTH 為零,則結果為空陣列 []。
1
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
)
*/
0
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));
}
?>
-1
匿名
18 年前
如果指定第四個參數(不重新分配鍵值),那麼似乎沒有辦法讓函式將所有值返回到陣列的末尾。賦值 -0 或 NULL 或只是連續輸入兩個逗號都不會返回任何結果。
-3
xananax at yelostudio dot com
13 年前
<?php
/**
* 根據值列表重新排序陣列的鍵值。
* @param array $array 要重新排序的陣列。以傳址方式傳遞
* @param array $list 重新排序的依據列表
* @param boolean $keepRest 如果設為 FALSE,則不在 $list 陣列中的任何內容都將被移除。
* @param boolean $prepend 如果設為 TRUE,則會將剩餘的值前置而不是附加它們
* @param boolean $preserveKeys 如果設為 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>';
/** 範例結束 **/
?>
-2
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
P 先生
16 年前
注意,偏移量與鍵值不同。偏移量總是從 0 開始,而鍵值可以是任何數字。

所以這樣

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

會產生以下結果
陣列
(
[0] => 5
[1] => 13
)
-3
aexchecker at yahoo dot com
17 年前
<?php
/**
* @desc
* Combines two arrays by inserting one into the other at a given position then
* returns the result.
*
* @since 2007/10/04
* @version v0.7 2007/10/04 18:47:52
* @author AexChecker <AexChecker@yahoo.com>
* @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)
);
}
?>
-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;
}

?>
-4
delew
13 年前
一點小技巧。
要保留鍵值而不提供長度:使用 NULL

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