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调用三种数据库的方法(3)
Oct 09 PHP
在 PHP 中使用随机数的三个步骤
Oct 09 PHP
PHP中for循环语句的几种变型
Nov 26 PHP
php fckeditor 调用的函数
Jun 21 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
Jul 01 PHP
linux中cd命令使用详解
Jan 08 PHP
利用PHP获取网站访客的所在地位置
Jan 18 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 PHP
在Laravel的Model层做数据缓存的实现
Sep 26 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 PHP
PHP替换Word中变量并导出PDF图片的实现方法
Nov 26 PHP
如何用PHP websocket实现网页实时聊天
May 26 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
用Flash图形化数据(二)
2006/10/09 PHP
php访问数组最后一个元素的函数end()用法
2015/03/18 PHP
WordPress中获取所使用的模板的页面ID的简单方法
2015/12/31 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
nodejs读取memcache示例分享
2014/01/02 NodeJs
JS实现的数组全排列输出算法
2015/03/19 Javascript
详解Bootstrap的aria-label和aria-labelledby应用
2016/01/04 Javascript
JS中from 表单序列化提交的代码
2017/01/20 Javascript
详解webpack进阶之插件篇
2017/07/06 Javascript
vue中路由参数传递可能会遇到的坑
2017/12/07 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
vuex实现的简单购物车功能示例
2019/02/13 Javascript
layer.open提交子页面的form和layedit文本编辑内容的方法
2019/09/27 Javascript
javascript设计模式 ? 迭代器模式原理与用法实例分析
2020/04/17 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
在python中实现将一张图片剪切成四份的方法
2018/12/05 Python
对python判断是否回文数的实例详解
2019/02/08 Python
Python的log日志功能及设置方法
2019/07/11 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
Python使用uuid库生成唯一标识ID
2020/02/12 Python
HTML5 拖拽批量上传文件的示例代码
2018/03/28 HTML / CSS
法国二手MacBook销售网站:Okamac
2019/03/18 全球购物
Linux的主要特性
2014/10/06 面试题
应聘编辑职位自荐信范文
2014/01/05 职场文书
心理学专业大学生职业生涯规划范文
2014/02/19 职场文书
总结表彰大会主持词
2014/03/26 职场文书
促销活动总结怎么写
2014/06/25 职场文书
商铺门前三包责任书
2014/07/25 职场文书
《中国梦我的梦》小学生演讲稿
2014/08/20 职场文书
学校关爱留守儿童活动方案
2014/08/27 职场文书
2014年“世界无车日”活动方案
2014/09/21 职场文书
公司财务经理岗位职责
2015/04/08 职场文书
幼儿园教师读书笔记
2015/06/29 职场文书
2016年大学生社区服务活动总结
2016/04/06 职场文书
优秀范文:《但愿人长久》教学反思3篇
2019/10/24 职场文书