Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Чтобы установить внутренний указатель на определенную позицию, вам нужно переслать его (используя 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 больше не даст вам правильного значения, но я предполагаю, что ключ, который вы ищете, все равно будет в массиве.

Ответ 2

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

$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]];

Ответ 3

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

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

Ответ 4

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

$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

Ответ 5

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

$_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];

Ответ 6

Решение @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

Ответ 7

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

<?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];        
}

Ответ 8

Расширяясь далее по решению 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];
}