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 之 没有mysql支持时的替代方案
Oct 09 PHP
php set_time_limit(0) 设置程序执行时间的函数
May 26 PHP
php入门学习知识点七 PHP函数的基本应用
Jul 14 PHP
php数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
Oct 29 PHP
php自动注册登录验证机制实现代码
Dec 20 PHP
php格式化日期和时间格式化示例分享
Feb 24 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
Sep 16 PHP
PHP中文编码小技巧
Dec 25 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
Mar 18 PHP
深入解析WordPress中加载模板的get_template_part函数
Jan 11 PHP
WordPress分页伪静态加html后缀
Jun 08 PHP
Thinkphp自定义生成缩略图尺寸的方法
Aug 05 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/20 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
php socket通信(tcp/udp)实例分析
2016/02/14 PHP
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
关闭ie窗口清除Session的解决方法
2014/01/10 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
gridview生成时如何去掉style属性中的border-collapse
2014/09/30 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
jquery+ajax请求且带返回值的代码
2015/08/12 Javascript
js正则表达式验证邮件地址
2015/11/12 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
2016/06/13 Javascript
JavaScript 控制字体大小设置的方法
2016/11/23 Javascript
JavaScrpt中如何使用 cookie 设置查看与删除功能
2017/07/09 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
极简主义法编写JavaScript类
2017/11/02 Javascript
微信小程序实现MUI数字输入框效果
2018/01/31 Javascript
浅谈Webpack 持久化缓存实践
2018/03/22 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
基于vue展开收起动画的示例代码
2018/07/05 Javascript
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
javascript 内存模型实例详解
2020/04/18 Javascript
JavaScript的垃圾回收机制与内存管理
2020/08/06 Javascript
python在linux中输出带颜色的文字的方法
2014/06/19 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
2018/11/14 Python
Python批量启动多线程代码实例
2020/02/18 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
2020/04/27 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
美国办公用品购物网站:Quill.com
2016/09/01 全球购物
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
创业计划书的内容步骤和要领
2014/01/04 职场文书
感恩母亲节活动方案
2014/03/04 职场文书
网络管理专业求职信
2014/03/15 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书