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面向对象全攻略 (十二) 抽象方法和抽象类
Sep 30 PHP
PHP 事务处理数据实现代码
May 13 PHP
php中mt_rand()随机数函数用法
Nov 24 PHP
PHP简单选择排序算法实例
Jan 26 PHP
php中stdClass的用法分析
Feb 27 PHP
Yii2创建表单(ActiveForm)方法详解
Jul 23 PHP
PHP自定义错误用法示例
Sep 28 PHP
php四种定界符详解
Feb 16 PHP
php 删除指定文件夹的实例讲解
Jul 25 PHP
PHP生成zip压缩包的常用方法示例
Aug 22 PHP
laravel框架 api自定义全局异常处理方法
Oct 11 PHP
TP3.2.3框架文件上传操作实例详解
Jan 23 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中的正规表达式(一)
2006/10/09 PHP
PHP动态规划解决0-1背包问题实例分析
2015/03/23 PHP
为何说PHP引用是个坑,要慎用
2018/04/02 PHP
PHP实现通过strace定位故障原因的方法
2018/04/29 PHP
怎么用javascript进行拖拽
2006/07/20 Javascript
extjs grid设置某列背景颜色和字体颜色的方法
2010/09/03 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
2013/02/05 Javascript
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
轻松创建nodejs服务器(8):非阻塞是如何实现的
2014/12/18 NodeJs
JS实现双击屏幕滚动效果代码
2015/10/28 Javascript
jquery获取所有选中的checkbox实现代码
2016/05/26 Javascript
Angular 常用指令实例总结整理
2016/12/13 Javascript
JavaScript 正则命名分组【推荐】
2018/06/07 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
nodejs环境使用Typeorm连接查询Oracle数据
2019/12/05 NodeJs
es6数组includes()用法实例分析
2020/04/18 Javascript
vue-router之解决addRoutes使用遇到的坑
2020/07/19 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
处理Python中的URLError异常的方法
2015/04/30 Python
python实现数据预处理之填充缺失值的示例
2017/12/22 Python
Python实现PS图像调整黑白效果示例
2018/01/25 Python
安装python时MySQLdb报错的问题描述及解决方法
2018/03/20 Python
PyQt5实现简易计算器
2020/05/30 Python
用python打印菱形的实操方法和代码
2019/06/25 Python
Python魔法方法 容器部方法详解
2020/01/02 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
2020/02/28 Python
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
行政助理岗位职责范文
2013/12/03 职场文书
工厂采购员岗位职责
2014/04/08 职场文书
民族团结先进集体事迹材料
2014/05/22 职场文书
承诺书格式
2014/06/03 职场文书
班级口号大全
2014/06/09 职场文书
法语专业求职信
2014/07/20 职场文书
幼儿园教师读书笔记
2015/06/29 职场文书
《灰雀》教学反思
2016/02/19 职场文书