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实现利用phpexcel导出数据
Aug 24 PHP
php preg_replace替换实例讲解
Nov 04 PHP
typecho插件编写教程(五):核心代码
May 28 PHP
php异常处理方法实例汇总
Jun 24 PHP
PHP Cookei记录用户历史浏览信息的代码
Feb 03 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
Mar 16 PHP
PHP安全下载文件的方法
Apr 07 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
Sep 01 PHP
PHP数组内存利用率低和弱类型详细解读
Aug 10 PHP
Laravel框架验证码类用法实例分析
Sep 11 PHP
用php定义一个数组最简单的方法
Oct 04 PHP
禁止直接访问php文件代码分享
May 05 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&amp;&amp;mysql)一
2006/10/09 PHP
php实现mysql数据库连接操作及用户管理
2015/11/08 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
JavaScript使用prototype定义对象类型
2007/02/07 Javascript
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
Jquery升级新版本后选择器的语法问题
2010/06/02 Javascript
lyhucSelect基于Jquery的Select数据联动插件
2011/03/29 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
js获取指定日期前后的日期代码
2013/08/20 Javascript
javascript中if和switch,==和===详解
2015/07/30 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
2018/01/02 jQuery
Node+OCR实现图像文字识别功能
2018/11/26 Javascript
vue.js中使用echarts实现数据动态刷新功能
2019/04/16 Javascript
详解vue 命名视图
2019/08/14 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法
2020/04/07 Javascript
js抽奖转盘实现方法分析
2020/05/16 Javascript
JavaScript 闭包的使用场景
2020/09/17 Javascript
[06:33]3.19 DOTA2发布会 海涛、冷冷、2009见证希望
2014/03/21 DOTA
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
使用python加密自己的密码
2015/08/04 Python
python3.5实现socket通讯示例(TCP)
2017/02/07 Python
python读取有密码的zip压缩文件实例
2019/02/08 Python
一篇文章了解Python中常见的序列化操作
2019/06/20 Python
PyQtGraph在pyqt中的应用及安装过程
2019/08/04 Python
python模块hashlib(加密服务)知识点讲解
2019/11/25 Python
Python使用Tkinter实现滚动抽奖器效果
2020/01/06 Python
python实现FTP循环上传文件
2020/03/20 Python
介绍一下linux的文件权限
2012/02/15 面试题
班班通校本培训方案
2014/03/12 职场文书
优质服务演讲稿
2014/05/14 职场文书
《成长的天空》读后感3篇
2019/12/06 职场文书