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

Как получить key элемента и value a в массиве 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 

Проблемы

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

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

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

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

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

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

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

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

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

  • На самом деле я спотыкаюсь на эту проблему, пытаясь как этот вопрос. Управление мега-массивами в PHP, поэтому я смотрю 1e6 или 1e7 с 512M memory limit

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

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

Предполагая 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]; 

редактировать

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

 $iterator = new ArrayIterator($array); $iterator->seek($position); echo $iterator->key(), " = ", $iterator->current(); // D = Four 

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

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

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

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

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

 $keys = array_keys($array); $value_3=$array[$keys[3]]; 

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

 $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's Right!\n"; } 

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