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

如何在没有循环的特定位置获得位于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

  • 这将是解决方案,但我后面weer因为我没有使用正面的键(我真的这不公平的PHP部分)

    Fatal error: Uncaught exception 'InvalidArgumentException' 
    with message 'array must contain only positive integer keys' 
    
  • 大数据集意味着什么:

  • 其实我试图在这个问题上1e6 1e7这个问题在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]];
    
    链接地址: http://www.djcxy.com/p/53041.html

    上一篇: Get Element at N position in an Array without Loop

    下一篇: foreach loop and reference of &$value