適用於關聯式陣列(鍵值)的陣列切片函式
function array_slice_assoc($array,$keys) {
return array_intersect_key($array,array_flip($keys));
}
(PHP 4, PHP 5, PHP 7, PHP 8)
array_slice — 擷取陣列的片段
array_slice() 會傳回從陣列 array
中,由 offset
和 length
參數指定的元素序列。
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 )
適用於關聯式陣列(鍵值)的陣列切片函式
function array_slice_assoc($array,$keys) {
return array_intersect_key($array,array_flip($keys));
}
如果您需要這個函式的關聯式版本,您可以執行以下操作
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
)
<?php
// 從陣列前端移除 $num 個元素
// 返回移除的部分,並縮短原陣列
function array_chop(&$arr, $num)
{
$ret = array_slice($arr, 0, $num);
$arr = array_slice($arr, $num);
return $ret;
}
基於 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 陣列
}
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)
請記住,array_slice 會返回包含當前元素的陣列。 如果您想取得後續元素,則必須使用 array_slice($array, $index+1)。
使用 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 的論壇,查看更多創新作品!
用於儲存陣列中數值索引的排序順序。PHP 版本 => 5.5.26
/*
範例
*/
$arr = array( "1" =>2, "2" =>3 , "3" =>5 );
print_r(array_slice($arr,1,null,true));
/*
結果
陣列
(
[2] => 3
[3] => 5
)
*/
<?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));
}
?>
<?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>';
/** 範例結束 **/
?>
/**
* 從陣列中移除一個值
* @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')
注意,偏移量與鍵值不同。偏移量總是從 0 開始,而鍵值可以是任何數字。
所以這樣
<?php print_r(array_slice(array(0 => 0, 5 => 5, 13 => 13),1)); ?>
會產生以下結果
陣列
(
[0] => 5
[1] => 13
)
<?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)
);
}
?>
有時您需要從陣列中挑選某些非整數和/或非連續的鍵值。可以考慮使用下面的 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;
}
?>