18

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

该方法的问题是

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

为什么不使用循环

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

为什么不使用数据库

  • 是的,使用像 Redis 这样的基于内存的数据库可以让生活更轻松,但特别是数组优化

为什么不使用SplFixedArray

  • 这本来是解决方案,但我遵循的是因为我没有使用正键(我真的这在 php 部分也不公平)

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

大数据集是什么意思:

我确信像fseekfor array 这样的东西可以解决问题..但不确定是否存在

4

4 回答 4

17

假设 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

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

于 2013-02-26T16:18:06.230 回答
6

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

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

如果您希望此操作快速进行,则必须使用正确的、数字和顺序索引的数组。

于 2013-02-26T16:19:25.573 回答
3

事实上你不需要 $values 数组:

$keys = array_keys($array);

$value_3=$array[$keys[3]];
于 2013-02-26T16:18:20.857 回答
0

我不太了解您的问题,但是如果您需要位置的关键和元素

$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";
}

你不需要为那个任务内爆

于 2013-02-26T16:16:32.213 回答