美文网首页
php中的生成器generators

php中的生成器generators

作者: 追梦人在路上不断追寻 | 来源:发表于2023-12-23 15:34 被阅读0次

在php中,当我们要处理大量的数据的时候,我们经常会遇到内存耗尽的错误提示,这是因为我们使用的数组超过了一定的限制,对于大数据的操作,如何减少内存的使用,答案就是使用生成器generators。

image.png

是一种特殊类型的迭代器,它允许你在循环中遍历一组数据而不需要将它们全部存储在内存中。生成器在PHP 5.5及更高版本中引入,通过 yield 关键字来实现。

基本的使用方法:

function simpleGenerator() {
    yield 1;
    yield 2;
    yield 3;
}

// 使用生成器
foreach (simpleGenerator() as $value) {
    echo $value . "\n";
}

在上面的例子中,simpleGenerator 函数定义了一个简单的生成器,使用 yield 关键字返回值。当使用 foreach 遍历生成器时,每次循环都会执行生成器函数,并在 yield 处暂停,返回一个值。

如何把一个不同函数转换成生成器:


function getNumbers($start = 1, $end = 10) {
    $numbers = [];
    for ($i = $start; $i <= $end; $i++) {
        $numbers[] = $i;
    }
    return $numbers;
}

这是一个返回指定长度数组函数,当数组较大时候,适合使用生成器,改成生成器之后是:

function getNumbersGenerator($start = 1, $end = 10) {
    for ($i = $start; $i <= $end; $i++) {
        yield $i;
    }
}

yield除了可以返回数值之外,还可以返回键值对:

function keyValueGenerator() {
    yield 'a' => 1;
    yield 'b' => 2;
    yield 'c' => 3;
}

此外,我们还可以向生成器发送数据:

function receiveDataGenerator() {
    while (true) {
        $data = yield;
        if ($data === 'stop') {
            return; // Exit the generator
        }
        echo "Received: $data<br>";
    }
}

$generator = receiveDataGenerator();
$generator->send('Hello');
$generator->send('World');
$generator->send('stop');

当然,生成器也可以有自己的返回值:

function countdownGenerator($start) {
    for ($i = $start; $i >= 0; $i--) {
        yield $i;
    }
    return 'Blastoff!';
}

$gen = countdownGenerator(5);
foreach ($gen as $value) {
    echo "$value<br>";
}
echo $gen->getReturn(); // Outputs 'Blastoff!'

使用生成器读取大文件:

function readFileLineByLine($filename) {
    $file = fopen($filename, 'r');
    while (!feof($file)) {
        yield fgets($file);
    }
    fclose($file);
}

foreach (readFileLineByLine('large_file.txt') as $line) {
    echo $line . "<br>";
}

相关文章

网友评论

      本文标题:php中的生成器generators

      本文链接:https://www.haomeiwen.com/subject/jrccndtx.html