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初学者们头痛的十四个问题
Jan 15 PHP
php MYSQL 数据备份类
Jun 19 PHP
PHP 面向对象 final类与final方法
May 05 PHP
PHP安全技术之 实现php基本安全
Sep 04 PHP
PHP编译安装中遇到的两个错误和解决方法
Aug 20 PHP
php单例模式示例分享
Feb 12 PHP
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
Mar 26 PHP
php实现编辑和保存文件的方法
Jul 20 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
Sep 13 PHP
php实现留言板功能(代码详解)
Mar 28 PHP
PHP基于堆栈实现的高级计算器功能示例
Sep 15 PHP
如何利用PHP实现上传图片功能详解
Sep 24 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
极典R601SW收音机
2021/03/02 无线电
phpmyadmin的#1251问题
2006/11/25 PHP
用PHP中的 == 运算符进行字符串比较
2006/11/26 PHP
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
ThinkPHP调试模式与日志记录概述
2014/08/22 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
2016/07/14 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
2017/06/12 PHP
ext for eclipse插件安装方法
2008/04/27 Javascript
ajaxControlToolkit AutoCompleteExtender的用法
2008/10/30 Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
2011/06/27 Javascript
js将字符串转成正则表达式的实现方法
2013/11/13 Javascript
jquery如何获取元素的滚动条高度等实现代码
2015/10/19 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
浅谈jQuery中hide和fadeOut的区别 show和fadeIn的区别
2016/08/18 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
JS实现的新闻列表自动滚动效果示例
2019/01/30 Javascript
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
Python爬虫设置代理IP(图文)
2018/12/23 Python
Python求均值,方差,标准差的实例
2019/06/29 Python
python配置文件写入过程详解
2019/10/19 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
python下载的库包存放路径
2020/07/27 Python
Python 可视化神器Plotly详解
2020/12/26 Python
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
厨师岗位职责
2013/11/12 职场文书
学生干部学习的自我评价
2014/02/18 职场文书
农业局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
python解决12306登录验证码的实现
2021/04/18 Python
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python