美文网首页
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