PHP5.5新特性之yield理解与用法实例分析


Posted in PHP onJanuary 11, 2019

本文实例讲述了PHP5.5新特性之yield理解与用法。分享给大家供大家参考,具体如下:

yield生成器是php5.5之后出现的,yield提供了一种更容易的方法来实现简单的迭代对象,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。

yield生成器允许你 在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组。

使用示例:

/**
 * 计算平方数列
 * @param $start
 * @param $stop
 * @return Generator
 */
function squares($start, $stop) {
  if ($start < $stop) {
    for ($i = $start; $i <= $stop; $i++) {
      yield $i => $i * $i;
    }
  }
  else {
    for ($i = $start; $i >= $stop; $i--) {
      yield $i => $i * $i; //迭代生成数组: 键=》值
    }
  }
}
foreach (squares(3, 15) as $n => $square) {
  echo $n . 'squared is' . $square . '<br>';
}

输出:

    3 squared is 9
    4 squared is 16
    5 squared is 25
    ...

示例2:

//对某一数组进行加权处理
$numbers = array('nike' => 200, 'jordan' => 500, 'adiads' => 800);
//通常方法,如果是百万级别的访问量,这种方法会占用极大内存
function rand_weight($numbers)
{
  $total = 0;
  foreach ($numbers as $number => $weight) {
    $total += $weight;
    $distribution[$number] = $total;
  }
  $rand = mt_rand(0, $total-1);
  foreach ($distribution as $num => $weight) {
    if ($rand < $weight) return $num;
  }
}
//改用yield生成器
function mt_rand_weight($numbers) {
  $total = 0;
  foreach ($numbers as $number => $weight) {
    $total += $weight;
    yield $number => $total;
  }
}
function mt_rand_generator($numbers)
{
  $total = array_sum($numbers);
  $rand = mt_rand(0, $total -1);
  foreach (mt_rand_weight($numbers) as $num => $weight) {
    if ($rand < $weight) return $num;
  }
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP cron中的批处理
Sep 16 PHP
php 移除数组重复元素的一点说明
Nov 27 PHP
PHP实现HTML页面静态化的方法
Nov 04 PHP
PHP中set error handler函数用法小结
Nov 11 PHP
PHP结合Jquery和ajax实现瀑布流特效
Jan 07 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
Jan 27 PHP
php生成Android客户端扫描可登录的二维码
May 13 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
Aug 12 PHP
PHP实现可精确验证身份证号码的工具类示例
May 31 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
Jun 05 PHP
PHP递归统计系统中代码行数
Sep 19 PHP
基于PHP的微信公众号的开发流程详解
Aug 07 PHP
PHP基于openssl实现的非对称加密操作示例
Jan 11 #PHP
PHP类的自动加载机制实现方法分析
Jan 10 #PHP
PHP验证类的封装与使用方法详解
Jan 10 #PHP
tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
Jan 10 #PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
Jan 10 #PHP
tp5框架使用composer实现日志记录功能示例
Jan 10 #PHP
PHP微信支付结果通知与回调策略分析
Jan 10 #PHP
You might like
php数组删除元素示例
2014/03/21 PHP
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
关于js datetime的那点事
2011/11/15 Javascript
JavaScript中for..in循环陷阱介绍
2013/11/12 Javascript
javascript创建createXmlHttpRequest对象示例代码
2014/02/10 Javascript
2014最热门的JavaScript代码高亮插件推荐
2014/11/25 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
2015/06/05 Javascript
总结javascript中的六种迭代器
2016/08/16 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
vue.js 1.x与2.0中js实时监听input值的变化
2017/03/15 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
jQuery Ajax 实现分页 kkpager插件实例代码
2017/08/10 jQuery
js实现鼠标跟随运动效果
2020/08/02 Javascript
认识jQuery的Promise的具体使用方法
2017/10/10 jQuery
JS时间戳与日期格式互相转换的简单方法示例
2021/01/30 Javascript
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
Python快速从注释生成文档的方法
2016/12/26 Python
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
Django原生sql也能使用Paginator分页的示例代码
2017/11/15 Python
Pytorch DataLoader 变长数据处理方式
2020/01/08 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
2020/02/20 Python
法拉利英国精品店:Ferraris Boutique UK
2019/07/20 全球购物
linux面试题参考答案(10)
2013/11/04 面试题
护士个人简历自荐信
2013/10/18 职场文书
副总经理任命书
2014/06/05 职场文书
银行纠风工作实施方案
2014/06/08 职场文书
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书
慰问信范文
2015/02/14 职场文书
优秀团员个人总结
2015/02/26 职场文书
个人向公司借款协议书
2016/03/19 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL
解析redis hash应用场景和常用命令
2021/08/04 Redis
MySQL派生表联表查询实战过程
2022/03/20 MySQL
MySQL限制查询和数据排序介绍
2022/03/25 MySQL