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 相关文章推荐
基于mysql的论坛(5)
Oct 09 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
Nov 01 PHP
解析使用ThinkPHP应该掌握的调试手段
Jun 20 PHP
Yii使用CLinkPager分页实例详解
Jul 23 PHP
ThinkPHP实现ajax仿官网搜索功能实例
Dec 02 PHP
php的ddos攻击解决方法
Jan 08 PHP
php模拟服务器实现autoindex效果的方法
Mar 10 PHP
PHP从FLV文件获取视频预览图的方法
Mar 12 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
May 28 PHP
Laravel使用原生sql语句并调用的方法
Oct 09 PHP
解决laravel 表单提交-POST 异常的问题
Oct 15 PHP
Laravel 错误提示本地化的实现
Oct 22 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 mysql数据库操作类
2008/06/04 PHP
fleaphp rolesNameField bug解决方法
2011/04/23 PHP
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
PHP多文件上传类实例
2015/03/07 PHP
php实现图片转换成ASCII码的方法
2015/04/03 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
让textarea控件的滚动条怎是位与最下方
2007/04/20 Javascript
在vs2010中调试javascript代码方法
2011/02/11 Javascript
ModelDialog JavaScript模态对话框类代码
2011/04/17 Javascript
JavaScript简单修改窗口大小的方法
2015/08/03 Javascript
js实现的后台左侧管理菜单代码
2015/09/11 Javascript
jQuery点击输入框显示验证码图片
2016/05/19 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
微信小程序自定义导航教程(兼容各种手机)
2018/12/12 Javascript
vue router 通过路由来实现切换头部标题功能
2019/04/24 Javascript
Python中用sleep()方法操作时间的教程
2015/05/22 Python
Python使用turtule画五角星的方法
2015/07/09 Python
Python命令启动Web服务器实例详解
2017/02/23 Python
Python生成密码库功能示例
2017/05/23 Python
django admin添加数据自动记录user到表中的实现方法
2018/01/05 Python
python函数的作用域及关键字详解
2019/08/20 Python
去除python中的字符串空格的简单方法
2020/12/22 Python
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
英国设计的甲板鞋和船鞋:Chatham
2018/12/06 全球购物
家长给小学生的评语
2014/01/30 职场文书
班主任工作经验材料
2014/02/02 职场文书
大学新生军训感言
2014/02/25 职场文书
行政部工作岗位职责范本
2014/03/05 职场文书
国旗下演讲稿
2014/05/08 职场文书
本科生自荐信
2014/06/18 职场文书
政府四风问题整改措施
2014/10/04 职场文书
个人典型事迹材料
2014/12/30 职场文书
mysql自增长id用完了该怎么办
2022/02/12 MySQL