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

Bab*_*aba 16 php arrays

如何让你获得元素keyvalue在一个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
Run Code Online (Sandbox Code Playgroud)

产量

D
Four
Run Code Online (Sandbox Code Playgroud)

这个方法的问题是

  • 多次复制数组导致更高的内存使用率

为什么不使用循环

  • 你必须多次获得多个位置.循环大数据集也不高效

为什么不使用数据库

  • 是的,使用基于内存的数据库(如Redis)可以使生活更轻松,但是特定的阵列优化

为什么不用 SplFixedArray

  • 这本来是解决方案,但我跟随自己,因为我没有使用正面的键(我真的这是不公平的PHP部分)

    Fatal error: Uncaught exception 'InvalidArgumentException' 
    with message 'array must contain only positive integer keys' 
    
    Run Code Online (Sandbox Code Playgroud)

大数据集是什么意思:

  • 实际上我在尝试这个问题时偶然发现了这个问题在PHP中管理mega数组所以我正在寻找1e6或者正在1e7使用512M memory limit

我确定像fseek数组这样的东西可以解决问题..但不确定是否存在

Dav*_*dom 16

假设PHP 5.4,使用数组解除引用:

echo $array[array_keys($array)[$position]];
Run Code Online (Sandbox Code Playgroud)

在早期版本中,您需要将其分为两行:

$keys = array_keys($array);
echo $array[$keys[$position]];
Run Code Online (Sandbox Code Playgroud)

如果你必须访问多个元素,那么在5.4+中使用双线方法也是值得的,只允许你只调用array_keys()一次相对昂贵的函数.此外,解除引用方法假定阵列中的特定位置存在,但它可能不存在.将其分解为多个操作将允许您处理该错误情况.

虽然您当然不需要访问密钥,但您可以简单地执行以下操作:

echo array_values($array)[$position];
// or
$values = array_values($array);
echo $values[$position];
Run Code Online (Sandbox Code Playgroud)

编辑

ArrayIterator课程也可以为您做到这一点:

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

echo $iterator->key(), " = ", $iterator->current(); // D = Four
Run Code Online (Sandbox Code Playgroud)

这可能是执行此操作的最便宜的方法,假设它在您执行此操作时不会在内存中创建数组的副本(仍在研究此元素),并且可能是多次访问任意键的最佳方法.

  • 我想,OP的问题是,在他的情况下,`array_keys`太昂贵了 - 例如,当一个数组包含数百万个项目时.然后,我还没有得到所有这些的用例:你很少需要使用代码中的项目而不是DB. (2认同)

Nik*_*kiC 5

你想要的是不可能的.PHP的数组通过密钥进行高效访问,但没有通过偏移进行有效访问.该顺序仅作为链表提供,因此您可以期望的最佳效率是O(n)循环,它只是遍历数组并查找偏移量:

$i = 0;
foreach ($array as $value) {
    if ($i++ === $offset) {
        // found value
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您希望此操作快速,那么您将必须使用正确的,数字和顺序索引的数组.

  • @raina77ow 我必须说实话,我更倾向于和 [PHP 核心开发人员](https://github.com/php/php-src/commits?author=nikic) 一起去[有`foreach`核心中的相关提交](https://github.com/php/php-src/commit/de80e3ce4b5b7a9ec0cfdd0778e77027a7ebfcc2) ;-) (2认同)