PHP yield生成器

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

使用

//生成器
function xrange($start, $end, $step)
{
    for ($i = $start, $k = 1; $i <= $end; $i += $step, $k++) {
        yield $k => $i;
    }
}

//输出
foreach (xrange(1, 10, 2) as $key => $value) {
    echo "<pre>";
    echo "{$key}=>{$value}";
    echo "<pre>";
}

输出结果

1=>1
2=>3
3=>5
4=>7
5=>9

是不是很简便。

高级用法

function getYield()
{
    yield 1;
    yield from [2, 3, 4];//php7 使用
    yield from new ArrayIterator([5, 6]); //php7使用 
}

foreach (getYield() as $value) {
    echo "{$value}" . PHP_EOL;
}

以上输出

1 2 3 4 5 6

修改下官方的菲波那切数列函数

//1 1 2 3 5 8
//一个生成器函数生成给定长度的菲波那切数列 由for或者foreach循环输出
function getFibonacci($len = 3)
{
    $i = 0;
    $k = 1; //first fibonacci value
    yield $k;//第一个 1
    //循环
    while ($len - 1 > 0) {
        $k = $i + $k;  //1 2 3 假如有三个数 a b c k等于前两个数相加  k=a+b
        $i = $k - $i;  //1 1 2 i等于第三个数-第一个数 为第二个数  i=b;
        yield $k;
        $len--;
    }
}

foreach (getFibonacci(10) as $value) {
    echo $value.PHP_EOL;
}

结果类似

1 1 2 3 5 8 13 21 34 55
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值