function xrange($start, $end, $step = 1)
{
$step = abs($step);
// 比较开始值和结束值 如果小则返回的数组顺序为升序 如果大则返回的数组为降序
if ($start < $end) :
// 如果开始值+间隔值 > 结束值 则报错
if ($start + $step > $end) {
throw new LogicException("间隔值不在范围");
}
// 按照升序将值放入到生成器中
for ($i = $start; $i <= $end; $i += $step) {
yield $i;
}
// 如果开始值和结束值相等则将开始值放入生成器
elseif ($start == $end):
yield $start;
else:
// 如果结束值+间隔值 > 开始值 则报错
if ($end + $step > $start) {
throw new LogicException("间隔值不在范围");
}
// 按照升序将值放入到生成器中
for ($i = $start; $i >= $end; $i -= $step) {
yield $i;
}
endif;
}
foreach (xrange(1,10,9) as $number):
echo $number."\n";
endforeach;
ps:最后说两句话 手册中的重写xrange 逻辑上不大正确 参数命名也不太正常
http://php.net/manual/zh/language.generators.overview.php
1.第二个参数应该是结束值或者是高的值的意思 下面的函数让人比较容易误会
2.range 并没有要求 step 是否是负值 只是要求 最小值+间隔值 不要大于最大值而已
希望看到的各位大神不要拍砖啊
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;
}
}
}
/*
* 注意下面range()和xrange()输出的结果是一样的。
*/
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 ";
}