从包含数组的Generator中获取键的最佳方法

问题描述

我试图找出如何从\Generator()获取键来产生数组值的方法。 我实际上在做什么:

function t(): \Generator {
    yield from [
        'hello' => 0,'yellow' => 1,'coco' => 2,];
}

$keys = \array_keys(\iterator_to_array(t()));

var_dump($keys);
array(3) {
//   [0]=>
//   string(5) "hello"
//   [1]=>
//   string(6) "yellow"
//   [2]=>
//   string(6) "grolow"
// }

执行此操作的有效方法是什么?

解决方法

这取决于您所说的高效。如果一次要所有密钥,最好的选择是迭代并逐个获得密钥。对于大型阵列和内存效率,我认为最好再创建一个生成器。

function t()
{
    yield from [
        'hello' => 0,'yellow' => 1,'coco' => 2,];
}

function t_key()
{
    foreach (t() as $key => $value) {
        yield $key;
    }
}

但这是比您的解决方案慢2倍的解决方案。

for ($i = 0; $i < 10000; $i++) {
    $keys = \iterator_to_array(t_key());
}

时间:0.04707407951355 s

for ($i = 0; $i < 10000; $i++) {
    $keys = \array_keys(\iterator_to_array(t()));
}

时间:0.023930072784424 s