在PHP中查找键值数组的前一个和后一个条目

3
我是一个有用的助手,可以进行文本翻译。
我有一个数组,包含键值对,我想要获取给定数组键的前一项和后一项。
示例:
$array = array(
    'one'   => 'first',
    'two'   => 'second',
    'three' => '3rd',
    'four'  => '4th'
)

当我拥有给定的键'two'时,我希望收到条目$array['one']$array['three'],是否有任何好的不使用foreach的解决方案

如果你搜索“one”,你期望得到什么? - Mark Baker
我有一个 $array,我想获取键为“two”的数组的前一个和后一个条目。 - powtac
我必须在前一条和后一条记录中搜索文本中是否有特殊字符。 - powtac
4个回答

3
你需要的两个函数是next()prev()。这些是原生的PHP函数,可以完美地实现你想要的功能:
$previousPage = prev($array);
$nextPage = next($array);

这些函数会移动内部指针,例如,如果你在 $array['two'] 上使用 prev($array),那么现在你就在 $array['one'] 上了。我的意思是,如果你需要获取 one 和 three,则需要调用 next() 两次。


我怎样才能“在$array['two']上”? - powtac

1
$array = array(
    'one'   => 'first',
    'two'   => 'second',
    'three' => '3rd',
    'four'  => '4th'
);


function getPrevNext($haystack,$needle) {
    $prev = $next = null;

    $aKeys = array_keys($haystack);
    $k = array_search($needle,$aKeys);
    if ($k !== false) {
        if ($k > 0)
            $prev = array($aKeys[$k-1] => $haystack[$aKeys[$k-1]]);
        if ($k < count($aKeys)-1)
            $next = array($aKeys[$k+1] => $haystack[$aKeys[$k+1]]);
    }
    return array($prev,$next);
}

var_dump(getPrevNext($array,'two'));

var_dump(getPrevNext($array,'one'));

var_dump(getPrevNext($array,'four'));

很酷 :) 一个没有使用foreach()的解决方案! - powtac

0
你可以定义自己的类来处理基本的数组操作:
以下是adityabhai[at]gmail.com [Aditya Bhatt]于2008年5月9日12:14在php.net上发布的示例:
<?php
class Steps {

    private $all;
    private $count;
    private $curr;

    public function __construct () {

      $this->count = 0;

    }

    public function add ($step) {

      $this->count++;
      $this->all[$this->count] = $step;

    }

    public function setCurrent ($step) {

      reset($this->all);
      for ($i=1; $i<=$this->count; $i++) {
        if ($this->all[$i]==$step) break;
        next($this->all);
      }
      $this->curr = current($this->all);

    }

    public function getCurrent () {

      return $this->curr;

    }

    public function getNext () {

      self::setCurrent($this->curr);
      return next($this->all);

    }

    public function getPrev () {

      self::setCurrent($this->curr);
      return prev($this->all);

    }

  }
?>

Demo Example:

<?php
   $steps = new Steps();
   $steps->add('1');
   $steps->add('2');
   $steps->add('3');
   $steps->add('4');
   $steps->add('5');
   $steps->add('6');
   $steps->setCurrent('4');
   echo $steps->getCurrent()."<br />";
   echo $steps->getNext()."<br />";
   echo $steps->getPrev()."<br />";
   $steps->setCurrent('2');
   echo $steps->getCurrent()."<br />";
   echo $steps->getNext()."<br />";
   echo $steps->getPrev()."<br />";
?>

这也是一个使用for(each)的解决方案... :-( - powtac

0

你可以尝试使用SPL CachingIterator的实现来解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接