У меня есть массив с определенными ключами:
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; } }
Просто перебирайте массив
$_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]; }