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生成带有雪花背景的验证码
Oct 09 PHP
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
Nov 02 PHP
Yii使用CLinkPager分页实例详解
Jul 23 PHP
ThinkPHP实现带验证码的文件上传功能实例
Nov 01 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
Jul 01 PHP
Zend Framework入门知识点小结
Mar 19 PHP
php有效防止图片盗用、盗链的两种方法
Nov 01 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
Nov 10 PHP
PHP中静态变量的使用方法实例分析
Dec 01 PHP
php断点续传之文件分割合并详解
Dec 13 PHP
PHP实现正则表达式分组捕获操作示例
Feb 03 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
Apr 16 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
截获网站title标签之家内容的例子
2006/10/09 PHP
JpGraph php柱状图使用介绍
2011/08/23 PHP
php中使用addslashes函数报错问题的解决方法
2013/02/06 PHP
PHP数组排序之sort、asort与ksort用法实例
2014/09/08 PHP
示例详解Laravel的注册重构
2016/08/14 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
2019/10/12 PHP
js实现正方形颜色从下往上升的效果
2014/08/04 Javascript
原生的html元素选择器类似jquery选择器
2014/10/15 Javascript
node.js中的console.time方法使用说明
2014/12/09 Javascript
jQuery圆形统计图开发实例
2015/01/04 Javascript
JavaScript中的函数(二)
2015/12/23 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
2016/12/16 Javascript
原生js中ajax访问的实例详解
2017/09/19 Javascript
React Native自定义控件底部抽屉菜单的示例
2018/02/08 Javascript
JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去
2019/07/23 Javascript
JavaScript单线程和任务队列原理解析
2020/02/04 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
Pthon批量处理将pdb文件生成dssp文件
2015/06/21 Python
从头学Python之编写可执行的.py文件
2017/11/28 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
Python 矩阵转置的几种方法小结
2019/12/02 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
给ubuntu18安装python3.7的详细教程
2020/06/08 Python
django rest framework 自定义返回方式
2020/07/12 Python
德国旅游网站:weg.de
2018/06/03 全球购物
DOM和JQuery对象有什么区别
2016/11/11 面试题
寒假实习自荐信
2014/01/26 职场文书
幼儿园师德师风学习材料
2014/05/29 职场文书
晚会开幕词
2015/01/28 职场文书
离婚答辩状范文
2015/05/22 职场文书
500字作文之难忘的同学
2019/12/20 职场文书
52条SQL语句教你性能优化
2021/05/25 MySQL
React如何创建组件
2021/06/27 Javascript
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js