问题标签 [php-generators]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
152 浏览

php - 重构比较/运算符块以干燥并降低 CRAP 级别

我着手围绕一组返回生成器的类(php 5.5)制作一个小项目。

这个小项目的主要动机是扩展我的 TDD 之旅,摆弄生成器,并有一个我可以扔到 packagist 上供以后使用的包。

整个“项目”的当前状态可以在Github找到

所有测试都是绿色的,方法可以满足我的要求。现在我想重构,因为我有很多重复。

该类还有一个名为 getOdd 的方法(是的,它看起来很像;))

主要的重复是闭包$Generator = function() ...,不同之处主要在于 for 循环中的运算符+ - * /和参数。这在其余班级中基本相同。

我阅读了 PHP 中的动态比较运算符,得出的结论是没有像这样的本地方法compare(...)

我是否应该使用私有/受保护的方法进行比较。如果是这样,我应该为此创建一个新的类/函数吗?我认为它不属于当前班级。

我还缺少其他东西吗,我不确定如何以适当的方式将其干燥?

顺便提一句。知道一个 getEven,当我得到一个带有 step 函数的 getRange 时,getOdd 有点傻,但这是一个更一般的重构/模式问题。

更新 @github,getEven 和 getOdd 现在已被删除...

0 投票
1 回答
64 浏览

php - 使用 while 迭代生成器

我正在为一个新项目编写 PDO 包装器。SQL 的一个非常常见的模式是编写一个语句,例如

我的包装函数本质上是这样的:

但是如果我使用while上面的循环调用它,我就不能使用这些值。做一个var_dump说那$row是一个生成器对象。如果我使用 a foreach, avar_dump按预期显示数据库数据。是根本不可能使用 遍历生成器while,还是我在这里把自己弄糊涂了?

0 投票
1 回答
4308 浏览

php - 高效的 PHP 算法生成输入的所有组合/排列

我正在尝试为多个输入计算数组中一组值的所有组合。类似于这个问题:

PHP算法从单个集合中生成特定大小的所有组合

例如:

输出:

但问题是当我将其增加到更大的列表时,例如:

排列的数量急剧增加,PHP 内存不足。显然,解决方案是使用生成器并在整个循环过程中产生结果。生成器的唯一示例是针对略有不同的问题集:

请参阅: https ://stackoverflow.com/a/27160465/345086

关于如何使用生成器来解决这个问题的任何想法?

0 投票
2 回答
23 浏览

php - 更容易的菜单生成取决于会话

我正在为网站语言制作一个菜单,它可以工作,但我认为我这样做的方式并不是最好的方式,以防我将来添加更多语言。也许有人可以举一个更好的例子。这是我所拥有的。

做一些数组和 foreach 函数可能会更好,但我不知道如何做那个 x,x 太令人困惑了

0 投票
2 回答
1725 浏览

php - 将 php yield / Generator::send() 用于“数据输出流”

我知道 yield 可用于创建数据迭代器,例如从 CSV 文件中读取数据。

但是 Generator::send() 方法表明我可以对顺序写入执行相同的操作,而不是读取。

例如,我想使用这样的东西:

我认为上述方法会起作用。

但是$output_generator->send(null);对于关闭似乎是错误的,或者不理想。这意味着我永远不能发送文字空值。这对于 csv 写入是可以的,但也许有一个发送 null 的用例。

有没有使用 php 生成器进行顺序编写的“最佳实践”?

0 投票
1 回答
737 浏览

php - php生成具有最小值和最大值的10的倍数的随机数

我想在最小和最大条件下生成 10 的随机数。示例 10、40、20、100、60。10 到 100 之间的数字

0 投票
0 回答
126 浏览

php - 在哪里可以找到 Phprunner 查询日志?

我有一个由Phprunner生成的项目。有些页面响应很慢。然后我想我必须以某种方式检查生成和执行的查询。我试过搜索低谷代码,我发现了很多执行函数。我不知道哪一个是正确的执行点。

我正在使用Phprunner 9.0、Php 5.6 和 MySQL。

我在哪里可以找到日志文件或放置记录器的正确位置?

0 投票
1 回答
3149 浏览

php - PHP 生成器返回类型

我以前从未在 PHP 中使用过生成器,并且文档中没有显示返回类型声明的示例。

在 PhpStorm 中,当我这样做时,IDE 中出现错误:

错误是:

生成器只能声明返回类型为 Generator、Iterator 或 Traversable,或 iterable,不允许使用 void。

我可以看到继承树是Traversable-> Iterator-> Generator。同时,iterable是 PHP 7.1 中引入的一种新的伪类型。

iterable如果我只需要支持 PHP >= 7.1,是否适合用于返回类型声明?

0 投票
0 回答
227 浏览

php - 同一个生成器上的多个循环 - PHP

我需要在多个循环上循环同一个生成器 - 我尝试使用倒带,但出现此错误 - “无法倒带已经运行的生成器”。

0 投票
1 回答
260 浏览

php - 如何确定生成器是否通过引用产生?

我正在编写一个通用组件,它包装了一个生成器并进行常规操作:

  • 按键过滤
  • 转换价值
  • 等等

为了尽可能接近地模拟包装的生成器,如果生成器正在使用引用,我想使用引用。

当我尝试使用方法迭代非参考生成器foreach ($generator as $key => &$value)时,我收到以下错误:

如果它声明它产生按引用,则只能迭代一个生成器按引用

有没有办法找出手头的生成器是否正在返回引用?我没有成功使用反射:

此外,不使用构造的迭代生成器foreach根本不适用于引用: