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连接MySQL代码的参数说明
Jun 07 PHP
php 数组的一个悲剧?
May 11 PHP
深入PHP变量存储的详解
Jun 13 PHP
PHP与MYSQL中UTF8编码的中文排序实例
Oct 21 PHP
php获得文件大小和文件创建时间的方法
Mar 13 PHP
Symfony2安装的方法(2种方法)
Feb 04 PHP
thinkPHP模板中for循环与switch语句用法示例
Nov 30 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
Nov 22 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
May 06 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 PHP
基于php+MySql实现学生信息管理系统实例
Aug 04 PHP
php使用Swoole实现毫秒级定时任务的方法
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实现下载生成某链接快捷方式的解决方法
2013/05/07 PHP
基于php的微信公众平台开发入门实例
2015/04/15 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
2020/04/06 PHP
jquery 1.4.2发布!主要是性能与API
2010/02/25 Javascript
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
jQuery中:enabled选择器用法实例
2015/01/04 Javascript
js正则表达式中exec用法实例
2015/07/23 Javascript
原生js编写autoComplete插件
2016/04/13 Javascript
JavaScript对象数组排序实例方法浅析
2016/06/15 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
vue2.0使用v-for循环制作多级嵌套菜单栏
2018/06/25 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
Vue商品控件与购物车联动效果的实例代码
2019/07/21 Javascript
微信小程序 冒泡事件原理解析
2019/09/27 Javascript
js最全的数组的降维5种办法(小结)
2020/04/28 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
2020/05/16 Javascript
使用vant的地域控件追加全部选项
2020/11/03 Javascript
python中hashlib模块用法示例
2017/10/30 Python
PyTorch快速搭建神经网络及其保存提取方法详解
2018/04/28 Python
详解Python使用Plotly绘图工具,绘制甘特图
2019/04/02 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
详解pandas中MultiIndex和对象实际索引不一致问题
2019/07/23 Python
tensorflow 保存模型和取出中间权重例子
2020/01/24 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
2020/02/12 Python
解决Django no such table: django_session的问题
2020/04/07 Python
python 写函数在一定条件下需要调用自身时的写法说明
2020/06/01 Python
python如何实现word批量转HTML
2020/09/30 Python
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
巾帼志愿者活动方案
2014/08/17 职场文书
中班下学期幼儿评语
2014/12/30 职场文书
高中生物教学反思
2016/02/20 职场文书
CSS中em的正确打开方式详解
2021/04/08 HTML / CSS