Ключ PHP => массив значений find prev и следующая запись - PullRequest
3 голосов
/ 21 марта 2011

У меня есть массив со значением key =>, и я хочу получить предыдущую и следующую запись для данного ключа массива.

Пример:

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

Когда у меня есть заданный ключ 'two' Я хочу получить записи $array['one'] и $array['three'], есть ли какое-нибудь приятное нет решения foreach ?

Ответы [ 4 ]

3 голосов
/ 21 марта 2011

Две функции, которые вы ищете: next () и prev () .Нативные функции PHP для того, чтобы делать именно то, что вам нужно:

$previousPage = prev($array);
$nextPage = next($array);

Эти функции перемещают внутренний указатель так, например, если вы находитесь в $ array ['two'] и используете prev ($ array), тогда высейчас находятся в массиве $ ['one'].Я понимаю, что если вам нужно получить один и три, вам нужно дважды вызвать next ().

1 голос
/ 21 марта 2011
$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'));
0 голосов
/ 21 марта 2011

Вы можете определить свой собственный класс, который обрабатывает основные операции с массивами:

Вот пример, опубликованный adityabhai [at] gmail com [Адитья Бхатт] 09-Май-2008 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 />";
?>
0 голосов
/ 21 марта 2011

Вы можете попробовать что-то сделать с помощью SPL CachingIterator.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...