Получить элемент в позиции N в массиве без цикла

Как получить элемент key и value в массиве позиции n в конкретной позиции без цикла.

Представьте

$postion = 3; // get array at 3rd position
$array = array(
        "A" => "Four",
        "B" => "twp",
        "C" => "three",
        "D" => "Four",
        "E" => "Five",
        "F" => "Four");


$keys = array_keys($array);
$value = array_values($array);

echo implode(array_slice($keys, $postion, 1)), PHP_EOL; // Key at 3rd posstion
echo implode(array_slice($value, $postion, 1)), PHP_EOL; // Value at n position

Выход

D
Four

Проблемы С помощью метода

  • Многократное дублирование массива, что приводит к увеличению использования памяти

Почему бы не использовать loop

  • Вам нужно получить несколько позиций несколько раз. Цикл большого набора данных неэффективен.

Почему бы не использовать базу данных

  • Да, работа с базой данных на базе данных, такой как Redis, может облегчить жизнь, но я оптимизирую конкретный массив.

Почему бы не использовать SplFixedArray

  • Это было бы решением, но я следую за ним, потому что не использую положительные ключи (я действительно это не честно на php-части)

    Fatal error: Uncaught exception 'InvalidArgumentException' 
    with message 'array must contain only positive integer keys' 
    

Что вы подразумеваете под большим набором данных:

Я уверен, что что-то вроде fseek для массива сделает трюк.. но не уверен, что это существует

Ответ 1

Предполагая PHP 5.4, с разыменованием массива:

echo $array[array_keys($array)[$position]];

В более ранних версиях вам нужно разбить его на две строки:

$keys = array_keys($array);
echo $array[$keys[$position]];

Также было бы полезно использовать двухстрочный подход в 5.4+, если вам нужно получить доступ к нескольким элементам, чтобы вы могли только вызвать относительно дорогостоящую функцию array_keys() один раз. Кроме того, подход разыменования предполагает, что существует определенная позиция внутри массива, что может и не быть. Прерывая его на несколько операций, вы сможете обрабатывать этот случай.

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

echo array_values($array)[$position];
// or
$values = array_values($array);
echo $values[$position];

Edit

Класс ArrayIterator также может сделать это для вас:

$iterator = new ArrayIterator($array);
$iterator->seek($position);

echo $iterator->key(), " = ", $iterator->current(); // D = Four

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

Ответ 2

То, что вы хотите, невозможно. PHP-массивы имеют эффективный доступ по ключевым словам, но не имеют эффективного доступа за счет смещения. Заказ доступен только как связанный список, поэтому наилучшей эффективностью, на которую вы можете надеяться, является цикл O (n), который просто проходит через массив и ищет смещение:

$i = 0;
foreach ($array as $value) {
    if ($i++ === $offset) {
        // found value
    }
}

Если вы хотите, чтобы эта операция была быстрой, вам нужно будет использовать правильный, численно и последовательно индексированный массив.

Ответ 3

на самом деле вам не нужен массив $values:

$keys = array_keys($array);

$value_3=$array[$keys[3]];

Ответ 4

Я плохо разбираюсь в вашем вопросе, но если вам нужен ключ и элемент из позиции

$position = 3; // get array at 3rd position
$array = array(
        "A" => "Four",
        "B" => "twp",
        "C" => "three",
        "D" => "Four",
        "E" => "Five",
        "F" => "Four");


$keys = array_keys($array);
$values = array_values($array);

if($values[$position] == "Four" && $keys[$position] == "D") {
    echo "All it Right!\n";
}

вам не нужна попытка для этой задачи