假设我有一个像下面的数组
[0] => 25
[1] => 30
[2] => 35
[3] => 40
[4] => 45
[5] => 50
[6] => 55
[7] => 60
[8] => 65
[9] => 70
如果我将密钥输入为4,则需要获取最近的2个数组,例如
[2] => 35
[3] => 40
[4] => 45
[5] => 50
[6] => 55
现在我使用类似下面的内容。
$key = 4;
$count = 2;
$slice = array_slice($array,$key-$count,4+($count-1));
但是如果我的$ key是1且count是2,则需要类似的东西
[0] => 25
[1] => 30
[2] => 35
[3] => 40
如果键是8,我需要
[6] => 55
[7] => 60
[8] => 65
[9] => 70
我无法在上面实现此切片代码,所以有人指导其他方式,谢谢。
您可能是说:
$slice = array_slice($array,$key-$count,**$key**+($count-1));
请确保您不会拒绝:
$key = 4;
$count = 2;
if ( ($key - $count) < 0){
$key = $count;
}
$slice = array_slice($array,$key-$count,$key+($count-1));
Erwin的答案是正确的。
如果在数组末尾给出了键,如果还要确保选择相同数量的值,则需要检查以下内容:
$key = 4;
$count = 2;
if ( ($key - $count) < 0){
$key = $count;
} elseif ( ($key + $count) > count($array) ) {
$key = count($array) - $count;
}
$slice = array_slice($array,$key-$count,$key+($count-1));
将偏移量设置为$key - $count
是正确的。您可以使用max()
使其变为负数。
$offset = max(0, $key - $count);
对于长度,基本计算为2 * $count + 1
。通过添加min($key - $count, 0)
,您可以减去将扩展到零以下的任何左侧计数。
$length = 2 * $count + 1 + min($key - $count, 0);
您无需担心切片是否超出数组的数量,该部分将被忽略。
$slice = array_slice($array, $offset, $length);
下面的代码满足您的测试用例
$array = array(
'0' => 25,
'1' => 30,
'2' => 35,
'3' => 40,
'4' => 45,
'5' => 50,
'6' => 55,
'7' => 60,
'8' => 65,
'9' => 70,
);
$key = 8;
$count = 2;
$slice = array_slice(
$array,
( ( $key - $count ) > 0 ) ? ( $key - $count) : 0 ,
( ( $key - $count ) > 0 ) ? ( (2 * $count) + 1 ) : ( (2 * $count) + ( $key - $count + 1 ) )
);
这里是在线demo