PHP получить предыдущий элемент массива, зная текущий ключ массива
у меня есть массив с ключами:
array(
420 => array(...),
430 => array(...),
555 => array(...)
)
в моем приложении я знаю текущий ключ (например 555
). И я хочу получить предыдущий элемент массива. В этом примере это элемент массива с ключом 430
. Как я могу сделать это в PHP? Я пытался работать с prev()
, но для этой функции мы должны знать текущий элемент массива. Я не нашел функцию, которая установила текущий элемент массива.
8 ответов
один вариант:
до установите внутренний указатель в определенное положение, вы должны переслать его (используя 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];
}
@return предыдущий ключ или 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];
}
расширяя далее решение Луки Боррионе и 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];
}