【问题标题】:How to get previous and next keys of a php array?如何获取php数组的上一个和下一个键?
【发布时间】:2017-09-06 21:57:09
【问题描述】:

下面是我要创建的数组,如果条件为

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

【问题讨论】:

标签: php arrays


【解决方案1】:

您不能在 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

【讨论】:

    【解决方案2】:

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

    我想在类型中创建 if 条件

    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 &lt; 2,并返回N/A,因为问题中没有描述这种情况。

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

    【讨论】:

      猜你喜欢
      • 2021-09-26
      • 2018-03-16
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多