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 相关文章推荐
相对路径转化成绝对路径
Apr 10 PHP
基于PHP常用字符串的总结(待续)
Jun 07 PHP
PHP中strtr字符串替换用法详解
Nov 26 PHP
php实现兼容2038年后Unix时间戳转换函数
Mar 18 PHP
3种php生成唯一id的方法
Nov 23 PHP
PHP邮件群发机实现代码
Feb 16 PHP
PHP框架性能测试报告
May 08 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
Sep 30 PHP
PHP-FPM运行状态的实时查看及监控详解
Nov 18 PHP
laravel异步监控定时调度器实例详解
Jun 21 PHP
php输出文字乱码的解决方法
Oct 04 PHP
Laravel解决nesting level错误和隐藏index.php的问题
Oct 12 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
回首过去10年中最搞笑的10部动漫,哪一部让你节操尽碎?
2020/03/03 日漫
zf框架的zend_cache缓存使用方法(zend框架)
2014/03/14 PHP
php的闭包(Closure)匿名函数初探
2016/02/14 PHP
laravel中的fillable和guarded属性详解
2019/10/23 PHP
javascript 拖动表格行实现代码
2011/05/05 Javascript
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
2011/11/05 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
2012/01/08 Javascript
JS替换字符串中字符即替换全部而不是第一个
2014/06/04 Javascript
javascript继承机制实例详解
2014/11/20 Javascript
JQuery实现防止退格键返回的方法
2015/02/12 Javascript
根据Bootstrap Paginator改写的js分页插件
2016/12/25 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
谈谈JavaScript中super(props)的重要性
2019/02/12 Javascript
vue-cli webpack配置文件分析
2019/05/20 Javascript
基于canvasJS在PHP中制作动态图表
2020/05/30 Javascript
基于javascript的无缝滚动动画1
2020/08/07 Javascript
python 排列组合之itertools
2013/03/20 Python
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
详解python脚本自动生成需要文件实例代码
2017/02/04 Python
Python 将pdf转成图片的方法
2018/04/23 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
Python传递参数的多种方式(小结)
2019/09/18 Python
python读文件的步骤
2019/10/08 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
2020/09/26 Python
初探CSS3中的calc()功能
2015/07/14 HTML / CSS
CSS3实现同时执行倾斜和旋转的动画效果
2016/10/27 HTML / CSS
YesStyle美国/全球:购买亚洲时装、美容化妆品和生活百货
2017/01/16 全球购物
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
什么是封装
2013/03/26 面试题
干部行政关系介绍信
2014/01/17 职场文书
2014年房地产工作总结范文
2014/11/19 职场文书
大学考试作弊检讨书
2015/05/06 职场文书
opencv-python图像配准(匹配和叠加)的实现
2021/06/23 Python