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 $_SERVER[&quot;REQUEST_URI&quot;]获取值的通用解决方法
Jun 21 PHP
php二维数组排序方法(array_multisort usort)
Dec 25 PHP
2个比较经典的PHP加密解密函数分享
Jul 01 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
Oct 15 PHP
利用PHP将图片转换成base64编码的实现方法
Sep 13 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
Sep 21 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
作为PHP程序员你要知道的另外一种日志
Jul 30 PHP
laravel异步监控定时调度器实例详解
Jun 21 PHP
PHP实现与java 通信的插件使用教程
Aug 11 PHP
laravel-admin select框默认选中的方法
Oct 03 PHP
Laravel5.1 框架路由基础详解
Jan 04 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的FTP学习(一)
2006/10/09 PHP
基于mysql的论坛(7)
2006/10/09 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
2013/06/13 PHP
php 生成短网址原理及代码
2014/01/23 PHP
PHP简单的MVC框架实现方法
2015/12/01 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
2016/11/18 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
取得传值的函数
2006/10/27 Javascript
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
Moment.js 不容错过的超棒Javascript日期处理类库
2012/04/15 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
jQuery取得select选择的文本与值的示例
2013/12/09 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
PhotoShop给图片自动添加边框及EXIF信息的JS脚本
2015/02/15 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
JavaScript中的parse()方法使用简介
2015/06/12 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
2016/07/09 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
2016/07/22 Javascript
JS实现直接运行html代码的方法
2017/03/13 Javascript
jQuery对底部导航进行跳转并高亮显示的实例代码
2019/04/23 jQuery
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
2019/06/26 Javascript
Javascript柯里化实现原理及作用解析
2020/10/22 Javascript
vue 使用微信jssdk,调用微信相册上传图片功能
2020/11/13 Javascript
ReactRouter的实现方法
2021/01/25 Javascript
Vue 3自定义指令开发的相关总结
2021/01/29 Vue.js
[43:32]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
pycharm远程调试openstack代码
2017/11/21 Python
Python自定义函数定义,参数,调用代码解析
2017/12/27 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
2018/06/11 Python
对Python3 序列解包详解
2019/02/16 Python
python实现简单的五子棋游戏
2020/09/01 Python
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
求职自我评价范文
2015/03/09 职场文书
学校工会工作总结2015
2015/05/19 职场文书
导游词之太湖
2019/10/08 职场文书
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android