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 数组的一个悲剧?
May 11 PHP
修改PHP的memory_limit限制的方法分享
Feb 21 PHP
PHP CodeBase:将时间显示为&quot;刚刚&quot;&quot;n分钟/小时前&quot;的方法详解
Jun 06 PHP
关于svn冲突的解决方法
Jun 21 PHP
php实现执行某一操作时弹出确认、取消对话框
Dec 30 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
Jun 06 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 PHP
php获取网站根目录物理路径的几种方法(推荐)
Mar 04 PHP
PHP中Notice错误常见解决方法
Apr 28 PHP
php 7新特性之类型申明详解
Jun 06 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
Jun 24 PHP
PHP配置文件php.ini中打开错误报告的设置方法
Jan 09 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提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
基于PHP 面向对象之成员方法详解
2013/05/04 PHP
ThinkPHP视图查询详解
2014/06/30 PHP
PHP实现添加购物车功能
2017/03/06 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
JavaScript之自定义类型
2012/05/04 Javascript
js防止表单重复提交的两种方法
2013/09/30 Javascript
jQuery类选择器用法实例
2014/12/23 Javascript
AngularJS基础 ng-keyup 指令简单示例
2016/08/02 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
浅谈Vue的基本应用
2016/12/27 Javascript
JavaScript两个变量交换值的实现方法
2017/03/01 Javascript
JavaScript简单拖拽效果(1)
2017/05/17 Javascript
jQuery与vue实现拖动验证码功能
2018/01/30 jQuery
ndm:NPM的桌面GUI应用程序
2018/10/15 Javascript
vue+element项目中过滤输入框特殊字符小结
2019/08/07 Javascript
Python将图片批量从png格式转换至WebP格式
2020/08/22 Python
基于随机梯度下降的矩阵分解推荐算法(python)
2018/08/31 Python
Python实现的多进程拷贝文件并显示百分比功能示例
2019/04/09 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
小女主人连衣裙:Little Mistress
2017/07/10 全球购物
团日活动总结模板
2014/06/25 职场文书
港澳通行证委托书怎么写
2014/08/02 职场文书
群众路线教育实践活动批评与自我批评
2014/09/15 职场文书
小学教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
七年级思品教学反思
2016/02/20 职场文书
爱岗敬业先进典型事迹材料(2016推荐版)
2016/02/26 职场文书
python 模块重载的五种方法
2021/04/24 Python
利用Python判断你的密码难度等级
2021/06/02 Python
Mysql调整优化之四种分区方式以及组合分区
2022/04/13 MySQL