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 相关文章推荐
提取HTML标签
Oct 09 PHP
php生成xml简单实例代码
Dec 16 PHP
PHP实现域名whois查询的代码(数据源万网、新网)
Feb 22 PHP
php 验证码实例代码
Jun 01 PHP
PHP中设置时区方法小结
Jun 03 PHP
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
Jun 01 PHP
浅谈php中mysql与mysqli的区别分析
Jun 10 PHP
基于php的微信公众平台开发入门实例
Apr 15 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
Dec 02 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
May 09 PHP
实现PHP中session存储及删除变量
Oct 15 PHP
php7 新增功能实例总结
May 25 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
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
PHP中调用ASP.NET的WebService的代码
2011/04/22 PHP
PHP学习笔记 (1) 环境配置与代码调试
2011/06/19 PHP
php 操作符与控制结构
2012/03/07 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
设置iframe的document.designMode后仅Firefox中其body.innerHTML为br
2012/02/27 Javascript
基于JQuery的多标签实现代码
2012/09/19 Javascript
JS实现鼠标单击与双击事件共存
2014/03/08 Javascript
js中style.display=&quot;&quot;无效的解决方法
2014/10/30 Javascript
JQuery选择器绑定事件及修改内容的方法
2015/01/23 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
2016/05/14 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
2016/09/04 Javascript
更靠谱的H5横竖屏检测方法(js代码)
2016/09/13 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
jfinal与bootstrap的登出实战详解
2017/11/27 Javascript
angular6.0开发教程之如何安装angular6.0框架
2018/06/29 Javascript
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python使用metaclass实现Singleton模式的方法
2015/05/05 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
2018/03/05 Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
2018/04/19 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
2019/06/17 Python
Django ORM 自定义 char 类型字段解析
2019/08/09 Python
python 给图像添加透明度(alpha通道)
2020/04/09 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
Python调用飞书发送消息的示例
2020/11/10 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
css3使用animation属性实现炫酷效果(推荐)
2020/02/04 HTML / CSS
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
服装采购员岗位职责
2014/03/15 职场文书
吃空饷专项整治方案
2014/10/27 职场文书
管理者们如何制定2019年的工作计划?
2019/07/01 职场文书
创业计划书之餐饮
2019/09/02 职场文书
CSS 实现多彩、智能的阴影效果
2021/05/12 HTML / CSS
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python