适用于关联数组(键)的数组切片函数
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
到 array
结尾的所有元素。
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 )
适用于关联数组(键)的数组切片函数
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']);
将返回
数组 (
'name' = 'Nathan',
'age' = 20
)
而
array_slice_assoc_inverse($arr, ['name']);
将返回
数组 (
'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 页面中引用的 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 的论坛以获取更多创新作品!
为了保存数组中数字索引的排序顺序。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,则将剩余的值放在开头而不是末尾。
* @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
* 将一个数组插入到另一个数组的指定位置,然后返回结果。
*
* @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)
);
}
?>
有时您需要从数组中提取某些非整数和/或非连续的键。考虑使用下面的 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;
}
?>