获取数组中键周围的数字

问题描述 投票:0回答:4

假设我有一个像下面的数组

   [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

我无法在上面实现此切片代码,所以有人指导其他方式,谢谢。

php
4个回答
0
投票

您可能是说:

$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));

0
投票

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));

0
投票

将偏移量设置为$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);

0
投票

下面的代码满足您的测试用例

$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

© www.soinside.com 2019 - 2024. All rights reserved.