适用于关联数组(键值)的数组切片函数
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
为负数,则序列将从数组末尾的该位置开始。
注意:
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 )
适用于关联数组(键值)的数组切片函数
function array_slice_assoc($array,$keys) {
return array_intersect_key($array,array_flip($keys));
}
<?php
// 从数组开头截取 $num 个元素
// 返回截取部分,缩短主体数组
function array_chop(&$arr, $num)
{
$ret = array_slice($arr, 0, $num);
$arr = array_slice($arr, $num);
return $ret;
}
如果您想要此函数的关联版本,可以执行以下操作
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
)
基于 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; // 如果没有找到值,只返回保存的数组
}
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));
/*
结果
Array
(
[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>';
/** 示例结束 **/
?>
<?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)
);
}
?>
/**
* 从数组中删除一个值
* @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')
有时你需要从数组中提取某些非整数或非连续的键。考虑使用下面的 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;
}
?>
请注意,偏移量与键不同。偏移量总是从 0 开始,而键可以是任何数字。
所以,
<?php print_r(array_slice(array(0 => 0, 5 => 5, 13 => 13),1)); ?>
将产生如下结果
Array
(
[0] => 5
[1] => 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>"; // 打印新的数组
?>
我试图找到一个好方法,从 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