资讯专栏INFORMATION COLUMN

PHP|生成器方法替代原生range

coolpail / 3460人阅读

摘要:标准的函数需要在内存中生成一个数组包含每一个在它范围内的值,然后返回该数组结果就是会产生多个很大的数组。下面来用的生成器,代替原生,实现的方法。关闭一个生成器的注意事项

关于生成器

当一个生成器被调用的时候,它返回一个可以被遍历的对象.当你遍历这个对象的时候(例如通过一个foreach循环),PHP 将会在每次需要值的时候调用生成器函数,并在产生一个值之后保存生成器的状态,这样它就可以在需要产生下一个值的时候恢复调用状态。

一旦不再需要产生更多的值,生成器函数可以简单退出,而调用生成器的代码还可以继续执行,就像一个数组已经被遍历完了。

Demo

标准的 range() 函数需要在内存中生成一个数组包含每一个在它范围内的值,然后返回该数组, 结果就是会产生多个很大的数组。 比如,调用 range(0, 1000000) 将导致内存占用超过 100 MB。

下面来用PHP的生成器,代替原生range,实现range的方法。

function xrange($start, $limit, $step = 1) {
    if ($start < $limit) {
        if ($step <= 0) {
            throw new LogicException("Step must be +ve");
        }

        for ($i = $start; $i <= $limit; $i += $step) {
            yield $i;
        }
    } else {
        if ($step >= 0) {
            throw new LogicException("Step must be -ve");
        }

        for ($i = $start; $i >= $limit; $i += $step) {
            yield $i;
        }
    }
}

Demo

echo "Single digit odd numbers from range():  ";
foreach (range(1, 9, 2) as $number) {
    echo "$number ";
}
echo "
";

echo "Single digit odd numbers from xrange(): ";
foreach (xrange(1, 9, 2) as $number) {
    echo "$number ";
}

关闭一个生成器的注意事项:

https://wiki.php.net/rfc/generators#closing_a_generator

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21713.html

相关文章

  • 重读PHP手册笔记系列(二)

    摘要:通过注册自动加载器,脚本引擎在出错失败前有了最后一个机会加载所需的类构造函数和析构函数构造函数允行开发者在一个类中定义一个方法作为构造函数。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行抽象类支持抽象类和抽象方法。 语言参考 1. 类型 1.1 简介 showImg(https://segmentfault.com/img/bVbqlNJ?w=531&h=379);...

    马龙驹 评论0 收藏0
  • 原生js替换jQuery各种方法-中文版

    摘要:本项目总结了大部分替代的方法,暂时只支持以上浏览器。返回指定元素及其后代的文本内容。从服务器读取数据并替换匹配元素的内容。用它自己的方式处理,原生遵循标准实现了最小来处理。当全部被解决时返回,当任一被拒绝时拒绝。是创建的一种方式。 原文https://github.com/nefe/You-D... You Dont Need jQuery showImg(https://segmen...

    lylwyy2016 评论0 收藏0
  • 原生php导出csv文件

    摘要:附上结果图片下图为方法中导出的练习数据,头部引入除过都是封装了的方法类,导出主要参考下面两个方法。 require(./db/dbManager.php); require(./session.php); require(./department_utils.php); class ExportCSV{ function __construct(){ $thi...

    yankeys 评论0 收藏0
  • 原生php导出csv文件

    摘要:附上结果图片下图为方法中导出的练习数据,头部引入除过都是封装了的方法类,导出主要参考下面两个方法。 require(./db/dbManager.php); require(./session.php); require(./department_utils.php); class ExportCSV{ function __construct(){ $thi...

    antyiwei 评论0 收藏0

发表评论

0条评论

coolpail

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<