PHP получает предыдущий элемент массива, зная текущий ключ массива

У меня есть массив с определенными ключами:

array( 420 => array(...), 430 => array(...), 555 => array(...) ) 

В моем приложении я знаю текущий ключ (например, 555 ). И я хочу получить предыдущий элемент массива. В этом примере это элемент массива с ключом 430 . Как я могу это сделать в PHP? Я пытался работать с prev() , но для этой функции мы должны знать текущий элемент массива. Я не нашел функцию, которая задает текущий элемент массива.

Один из вариантов:

Чтобы установить внутренний указатель на определенную позицию , вам необходимо переслать его (используя key и next , возможно, выполнить reset до того, как вы начнете с начала массива):

 while(key($array) !== $key) next($array); 

Затем вы можете использовать prev() :

 $prev_val = prev($array); // and to get the key $prev_key = key($array); 

В зависимости от того, что вы собираетесь делать с массивом впоследствии, вы можете reset внутренний указатель.

Если ключ не существует в массиве, у вас есть бесконечный цикл, но это можно решить с помощью:

  while(key($array) !== null && key($array) !== $key) 

Конечно, prev больше не даст вам правильного значения, но я предполагаю, что ключ, который вы ищете, будет в массиве в любом случае.

Решение с быстрым поиском: (если вам нужно сделать это более одного раза)

 $keys = array_flip(array_keys($array)); $values = array_values($array); return $values[$keys[555]-1]; 

array_flip ( array_keys ($array)); вернет ключи сопоставления массива в их положение в исходном массиве, например array(420 => 0, 430 => 1, 555 => 2) .

И array_values () возвращает позиции сопоставления массива значениям, например array(0 => /* value of $array[420] */, ...) .

Таким образом, $values[$keys[555]-1] эффективно возвращает предыдущие элементы, учитывая, что текущий имеет ключ 555.

Альтернативное решение:

 $keys = array_keys($array); return $array[$keys[array_search(555, $keys)-1]]; 

Я решил эту проблему следующим образом:

 function getPrevKey($key, $hash = array()) { $keys = array_keys($hash); $found_index = array_search($key, $keys); if ($found_index === false || $found_index === 0) return false; return $keys[$found_index-1]; } 

@ вернуть предыдущий ключ или false, если предыдущий ключ недоступен

Пример:

 $myhash = array( 'foo' => 'foovalue', 'goo' => 'goovalue', 'moo' => 'moovalue', 'zoo' => 'zoovalue' ); echo "TEST: ". getPrevKey('zoo', $myhash); // prints moo 

Вы можете перебирать массив в обратном порядке и возвращать следующую итерацию после нахождения значения поиска.

 $found = false; foreach(array_reverse($array, true) as $key=>$value) { if ($found) { print "$key => $value\n"; break; } else if ($key == 555) { $found = true; } } 

http://ideone.com/2WqmC

Просто перебирайте массив

 $_index = null; foreach($myarray as $index => $value) { if($key == $my_index) // if($key == 550) { break; } $_index = $index; } echo $_index; //the prev key from 550; 

Альтернативным решением является получение ключей вашего массива в перечислимом массиве следующим образом:

 $keys = array_keys($my_array); 

поскольку массив ключей является индексом, вы можете переместить предыдущий ключ так:

 $required_key = (array_search(550,$keys,true) - 1); 

это будет штрафовать значение 550 и вернуть его индекс в ключи, удалить его, чтобы получить предыдущий индекс

у нас есть наш предыдущий ключ, чтобы получить значение из исходного массива

 $value = $my_array[$required_key]; 

Решение @Luca Borrione было полезно. Если вы хотите найти предыдущий и следующий ключи, вы можете использовать следующую функцию:

 function getAdjascentKey( $key, $hash = array(), $increment ) { $keys = array_keys( $hash ); $found_index = array_search( $key, $keys ); if ( $found_index === false ) { return false; } $newindex = $found_index+$increment; // returns false if no result found return ($newindex > 0 && $newindex < sizeof($hash)) ? $keys[$newindex] : false; } 

Применение:

 // previous key getAdjascentKey( $key, $hash, -1 ); // next key getAdjascentKey( $key, $hash, +1 ); 

Примеры:

 $myhash = array( 'foo' => 'foovalue', 'goo' => 'goovalue', 'moo' => 'moovalue', 'zoo' => 'zoovalue' ); getAdjascentKey( 'goo', $myhash, +1 ); // moo getAdjascentKey( 'zoo', $myhash, +1 ); // false getAdjascentKey( 'foo', $myhash, -1 ); // false 

Это простое решение для приема предыдущих и следующих элементов, даже если мы находимся в конце массива.

 <?php $current_key; // the key of the item we want to search from if (isset($array[$current_key+1])) { // get the next item if there is $array_next = $array[$current_key+1]; } else { // if not take the first (this means this is the end of the array) $array_next = $array[0]; } if (isset($array[$current_key-1])) { // get the previous item if there is $array_prev = $array[$current_key-1]; } else { // if not take the last item (this means this is the beginning of the array) $array_prev = $array[count($array)-1]; } 

Расширяясь далее по решению Luca Borrione и cenk, чтобы вы могли обернуть вокруг конца массива в любом направлении, вы можете использовать:

 function getAdjascentKey($key, $hash = array(), $increment) { $keys = array_keys($hash); $found_index = array_search($key, $keys); if ($found_index === min(array_keys($keys)) && $increment === -1) { $found_index = max(array_keys($keys))+1; } if ($found_index === max(array_keys($keys)) && $increment === +1) { $found_index = min(array_keys($keys))-1; } return $keys[$found_index+$increment]; }