PHP 生成器

2018-03-24  本文已影响0人  dongshixiao

在学习python时,发现有个yield(生成器)的概念,就特别留意了下。看书时发现PHP在5.5中已经增加了生成器的概念,用法和python中一样。写个demo给小伙伴们看看。

第一个例子是不使用生成器的例子:
创建一个100000个元素的数组

function makeRange($length)
{
    $data = [];
    for ($i=0; $i <$length ; $i++) { 
        $data[] = $i;
    }
    return $data;
}

$bigIntRang = makeRange(100000);

foreach ($bigIntRang as $i) {
    echo $i.PHP_EOL;
}

上述方法会在内存中创建一个100000个int型的空间,内存占用会非常高,不建议使用。
使用生成器的demo:

function makeRange_1($length)
{
    for ($i=0; $i <$length ; $i++) { 
        yield $i;
    }
}
foreach (makeRange_1(100000) as $i) {
    echo $i.PHP_EOL;
}

生成器 节省内存

使用生成器 每次调用时才会创建一个int型空间,非常节省内存。建议数据量大的时候使用。
再比如调用一个很大的数据块,如一个非常大的data.csv文件:

function getRows($file)
{
    $handle = fopen($file, 'rb');
    if ($handle === false){
        throw new \Exception();
    }
    while (feof($handle) === false){
        yield fgetcsv($handle);
    }
    fclose($handle);
}

foreach (getRows('data.csv') as $row){
    print_r($row);
    echo '<hr>';
}
上一篇下一篇

猜你喜欢

热点阅读