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 has encountered an Access Violation
Jan 15 PHP
Win2003服务器安全加固设置--进一步提高服务器安全性
May 23 PHP
php minixml详解
Jul 19 PHP
PHP iconv 函数转gb2312的bug解决方法
Oct 11 PHP
php数组合并array_merge()函数使用注意事项
Jun 19 PHP
PHP中的reflection反射机制测试例子
Aug 05 PHP
PHP中单引号与双引号的区别分析
Aug 19 PHP
CI框架Session.php源码分析
Nov 03 PHP
基于php实现随机合并数组并排序(原排序)
Nov 26 PHP
Yii2 assets清除缓存的方法
May 16 PHP
Centos PHP 扩展Xchche的安装教程
Jul 09 PHP
Yii框架响应组件用法实例分析
Sep 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序列号生成函数和字符串替换函数代码
2012/06/07 PHP
PHP小教程之实现链表
2014/06/09 PHP
laravel 解决多库下的DB::transaction()事务失效问题
2019/10/21 PHP
一种JavaScript的设计模式
2006/11/22 Javascript
js如何获取file控件的完整路径具体实现代码
2013/05/15 Javascript
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
2013/07/03 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
2015/07/27 Javascript
jQuery实现的简单拖动层示例
2017/02/22 Javascript
Bootstrap警告(Alerts)的实现方法
2017/03/22 Javascript
seajs实现强制刷新本地缓存的方法分析
2017/10/16 Javascript
Javascript格式化并高亮xml字符串的方法及注意事项
2018/08/13 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
2018/09/15 Javascript
详解vue使用$http服务端收不到参数
2019/04/19 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
[01:35:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第一场 1月18日
2021/03/11 DOTA
Python正则表达式的使用范例详解
2014/08/08 Python
简介Python设计模式中的代理模式与模板方法模式编程
2016/02/02 Python
OpenCV实现人脸识别
2017/04/07 Python
python,Django实现的淘宝客登录功能示例
2019/06/12 Python
python list多级排序知识点总结
2019/10/23 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
python的json中方法及jsonpath模块用法分析
2019/12/06 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
Python中pass的作用与使用教程
2020/11/13 Python
python多线程和多进程关系详解
2020/12/14 Python
纯CSS3+DIV实现小三角形边框效果的示例代码
2020/08/03 HTML / CSS
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
主管职责范文
2013/11/09 职场文书
办理信用卡工作证明
2014/01/11 职场文书
优秀教师主要事迹
2014/02/01 职场文书
党的群众路线教育实践活动自我剖析材料
2014/10/08 职场文书
求职自我评价范文
2015/03/09 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书
python如何利用cv2模块读取显示保存图片
2021/06/04 Python
Python安装使用Scrapy框架
2022/04/12 Python