首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Generators overview

(PHP 5 >= 5.5.0, PHP 7)

Generators provide an easy way to implement simple iterators without the overhead or complexity of implementing a class that implements the Iterator interface.

A generator allows you to write code that uses foreach to iterate over a set of data without needing to build an array in memory, which may cause you to exceed a memory limit, or require a considerable amount of processing time to generate. Instead, you can write a generator function, which is the same as a normal function, except that instead of returning once, a generator can yield as many times as it needs to in order to provide the values to be iterated over.

A simple example of this is to reimplement the range() function as a generator. The standard range() function has to generate an array with every value in it and return it, which can result in large arrays: for example, calling range(0, 1000000) will result in well over 100 MB of memory being used.

As an alternative, we can implement an xrange() generator, which will only ever need enough memory to create an Iterator object and track the current state of the generator internally, which turns out to be less than 1 kilobyte.

Example #1 Implementing range() as a generator

代码语言:javascript
复制
<?php
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;
????????}
????}
}

/*
?*?Note?that?both?range()?and?xrange()?result?in?the?same
?*?output?below.
?*/

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

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

The above example will output:

代码语言:javascript
复制
Single digit odd numbers from range():  1 3 5 7 9 
Single digit odd numbers from xrange(): 1 3 5 7 9 

Generator objects

When a generator function is called for the first time, an object of the internal Generator class is returned. This object implements the Iterator interface in much the same way as a forward-only iterator object would, and provides methods that can be called to manipulate the state of the generator, including sending values to and returning values from it.

Generator syntax →

代码语言:txt
复制
 ? 1997–2017 The PHP Documentation Group

Licensed under the Creative Commons Attribution License v3.0 or later.

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com