PHP yield关键字功能与用法分析


Posted in PHP onJanuary 03, 2019

本文实例讲述了PHP yield关键字功能与用法。分享给大家供大家参考,具体如下:

yield 关键字是php5.5版本推出的一个特性。生成器函数的核心是yield关键字。它最简单的调用形式看起来像一个return申明,不同之处在于普通return会返回值并终止函数的执行,而yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。

Example #1 一个简单的生成值的例子

<?php
function gen_one_to_three() {
  for ($i = 1; $i <= 3; $i++) {
    //注意变量$i的值在不同的yield之间是保持传递的。
    yield $i;
  }
}
$generator = gen_one_to_three();
foreach ($generator as $value) {
  echo "$value\n";
}
?>

简单来说就是:yield是仅仅是记录迭代过程中的一个过程值

补充示例:

示例2:

/**
 * 计算平方数列
 * @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
    ...

示例3:

//对某一数组进行加权处理
$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的正则处理函数总结分析
Jun 20 PHP
php面向对象全攻略 (十) final static const关键字的使用
Sep 30 PHP
PHP类的使用 实例代码讲解
Dec 28 PHP
php in_array 函数使用说明与in_array需要注意的地方说明
Apr 13 PHP
PHP调用VC编写的COM组件实例
Mar 29 PHP
ThinkPHP行为扩展Behavior应用实例详解
Jul 22 PHP
Laravel与CI框架中截取字符串函数
May 08 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
PHP实现简单的模板引擎功能示例
Sep 02 PHP
PHP基于swoole多进程操作示例
Aug 12 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
Oct 18 PHP
laravel excel 上传文件保存到本地服务器功能
Nov 14 PHP
PHP获取对象属性的三种方法实例分析
Jan 03 #PHP
PHP获取HTTP body内容的方法
Dec 31 #PHP
php两点地理坐标距离的计算方法
Dec 29 #PHP
php如何计算两坐标点之间的距离
Dec 29 #PHP
PHP命名空间简单用法示例
Dec 28 #PHP
PHP实现函数内修改外部变量值的方法示例
Dec 28 #PHP
PHP面向对象程序设计继承用法简单示例
Dec 28 #PHP
You might like
PHP网页游戏学习之Xnova(ogame)源码解读(五)
2014/06/23 PHP
ThinkPHP模板判断输出Defined标签用法详解
2014/06/30 PHP
PHP基于单例模式实现的数据库操作基类
2016/01/15 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
如何在Laravel5.8中正确地应用Repository设计模式
2019/11/26 PHP
Javascript的IE和Firefox兼容性汇编
2006/07/01 Javascript
用javascript实现的图片马赛克后显示并切换加文字功能
2007/04/21 Javascript
JavaScript 判断指定字符串是否为有效数字
2010/05/11 Javascript
基于jQuery的试卷自动排版系统实现代码
2011/01/06 Javascript
javascript:history.go()和History.back()的区别及应用
2012/11/25 Javascript
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
jQuery中ajax的load()方法用法实例
2014/12/26 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
2016/12/05 Javascript
js制作简单的音乐播放器的示例代码
2017/08/28 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
JS异步执行结果获取的3种解决方式
2019/02/19 Javascript
js回文数的4种判断方法示例
2019/06/04 Javascript
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
跟老齐学Python之Python安装
2014/09/12 Python
Python 常用string函数详解
2016/05/30 Python
Python做文本按行去重的实现方法
2016/10/19 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
判断Threading.start新线程是否执行完毕的实例
2020/05/02 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
实习鉴定范文
2013/12/19 职场文书
公证书标准格式
2014/04/10 职场文书
学生偷窃检讨书
2014/09/25 职场文书
2015年保管员工作总结
2015/04/30 职场文书
旅游项目合作意向书
2015/05/08 职场文书
健康证明
2015/06/19 职场文书
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS