在没有循环的数组中获取N位置的元素


Get Element at N position in an Array without Loop

如何在没有循环的情况下,在特定位置的n位置数组中获得元素keyvalue

想象一下

$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中管理巨型数组时,我偶然发现了这个问题,所以我正在研究1e61e7512M memory limit

我确信像fseek这样的数组会起作用。。但不确定是否存在

假设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";
}

你不需要内爆的任务