如何获取php数组的上一个和下一个键?

时间:2017-09-06 21:57:09

标签: php arrays

如果

类型的条件,下面是我要创建的数组
if (($variable >=2) && ($variable <3)) { echo '10'; }

但是要创建这个,我需要使用数组的上一个和下一个项目。 我怎样才能达到这个结果?

Array
(
    [2] => 10
    [3] => 14
    [4] => 15
    [5] => 16
    [8] => 17
    [14] => 18
    [51] => 19
    [94] => 20
)


   foreach($the_final_array as $key => $value){
echo $key;
echo $value;
echo $previous_key;
echo $nect_key;
}

2 个答案:

答案 0 :(得分:0)

你不能在foreach上使用next()和prev(),因为它适用于数组的副本,并且你没有一个很好的顺序索引0,1,2,3。 ..所以你不能做简单的加法/减法,但是你可以自己管理光标位置。

使用do / while循环,您可以使用next()进行手动前进,然后向后前进,同时考虑到如果您快退或前进太远,则会中断阵列光标。

$array = array( 2=>10, 3=>14, 4=>15, 5=>16, 8=>17, 14=>18 );

$value = current( $array );

do
{

  echo 'current-key: ' . key( $array ) . PHP_EOL;
  echo 'current-value: ' . $value . PHP_EOL;

  // PREV
  if( ( $prev = prev( $array ) ) === false )
  {
    echo 'prev-key: N/A' . PHP_EOL;
    echo 'prev-value: N/A' . PHP_EOL;
    reset( $array );  // Restore cursor
  }
  else
  {
    echo 'prev-key: ' . key( $array ) . PHP_EOL;
    echo 'prev-value: ' . $prev . PHP_EOL;
    next( $array ); // Restore cursor
  }

  // NEXT
  if( ( $next = next( $array ) ) === false )
  {
    echo 'next-key: N/A' . PHP_EOL;
    echo 'next-value: N/A' . PHP_EOL;
    end( $array ); // Restore cursor
  }
  else
  {
    echo 'next-key: ' . key( $array ) . PHP_EOL;
    echo 'next-value: ' . $next . PHP_EOL;
    prev( $array ); // Restore cursor
  }

  echo PHP_EOL;

} while( $value = next( $array ) );

这将打印如下所示的块

// current-key: 2
// current-value: 10
// prev-key: N/A
// prev-value: N/A
// next-key: 3
// next-value: 14
//
// current-key: 3
// current-value: 14
// prev-key: 2
// prev-value: 10
// next-key: 4
// next-value: 15
//
// current-key: 4
// current-value: 15
// prev-key: 3
// prev-value: 14
// next-key: 5
// next-value: 16

答案 1 :(得分:0)

也许我错了,但从你问题的第一部分我认为你不需要获得数组的上一个或下一个键/项。

  

我想创建条件

的条件
if (($variable >=2) && ($variable <3)) { echo '10'; }

您似乎有一些间隔,并且您想知道哪个区间包含$variable的值,并为每个区间打印不同的值。

最简单的解决方案是使用一组级联的if语句:

if ($variable < 2) {                 // $variable < 2
    echo('N/A');
} elseif ($variable < 3) {           // 2 <= $variable < 3
    echo(10);
} elseif ($variable < 4) {           // 3 <= $variable < 4
    echo(14);
} elseif ($variable < 5) {           // 4 <= $variable < 5
    echo(15);
} elseif ($variable < 8) {           // 5 <= $variable < 8
    echo(16);
} elseif ($variable < 14) {          // 8 <= $variable < 14
    echo(17);
} elseif ($variable < 51) {          // 14 <= $variable < 51
    echo(18);
} elseif ($variable < 94) {          // 51 <= $variable < 94
    echo(19);
} else {                             // 94 <= $variable
    echo(20);
}

此策略运行良好,易于阅读和理解。

但是,当编写代码时未知范围列表(及其值)时(例如,从数据库加载),它不起作用。

在这种情况下,可以使用简单的foreach循环遍历列表并标识正确的范围。

function getValue($input)
{
    $limits = array(
        2 => 10,
        3 => 14,
        4 => 15,
        5 => 16,
        8 => 17,
        14 => 18,
        51 => 19,
        94 => 20,
    );

    foreach (array_reverse($limits, TRUE) as $key => $value) {
        if ($key <= $input) {
            return $value;
        }
    }

    return 'N/A';
}


echo(getValue(2));              # 10
echo(getValue(6));              # 16
echo(getValue(25));             # 18
echo(getValue(51));             # 19
echo(getValue(100));            # 20

函数array_reverse()以相反的顺序返回包含元素的数组。传递TRUE作为其第二个参数使其保留原始数组的键/值关联。

foreach循环以相反的顺序将输入值与数组的键进行比较。当找到小于输入值的键时,它是较低的范围界限,并返回相关的值。

如果输入值小于数组的任何键,则表示$variable < 2,并返回N/A,因为问题中未描述此情况。

如果您需要多次运行此代码和/或范围列表较大,那么最好将边界列表降序排序并删除对array_reverse()的调用(仅使用$bounds代替)。