请问我这样使用 PHP 的迭代器对吗?

2015-01-15 20:45:55 +08:00
 mikej
class Foo
{
static public function bar()
{
$generator = function ($data) {
foreach ($data as $key => $value) {
yield $key => $value;
}
};

$arr = array(); # 生成的 一个大数组

foreach ($generator($arr) as $k => $v) {
# do something
}
}
}
Foo::bar();


这个今天我在项目中写的代码,不过回头想了下,这样会比直接循环好吗?感觉$arr(一个大数组)在作为参数传递也很耗费资源吧,还是我根本就是多此一举,请教一下各位。多谢!
2697 次点击
所在节点    PHP
6 条回复
Sunyanzi
2015-01-16 01:27:30 +08:00
没错 ... 这就是多此一举 ... 为什么你会认为这样会比直接循环好的 ..?

这样的性能损耗远比直接 foreach 一个大数组来的要大 ...

当然如果你的目的是拖慢程序及增大脚本的内存占用才用的这种写法 ... 那么恭喜你达到了目的 ...
mikej
2015-01-16 10:29:29 +08:00
@Sunyanzi 感谢回复!

确实是这样, 我查阅了一些资料, 正确的使用方法应该是在迭代器函数内, 也就是generator() 函数里生成数据, 才可以降低内存消耗

再求问下大神, 你们会经常用到yield吗, 一般会用到哪些使用场景 ?
xwsoul
2015-01-16 16:53:00 +08:00
从数据源获取数据的时候需要的吧...
不过yield 还没用过...
Sunyanzi
2015-01-17 01:57:56 +08:00
不会经常用到 ... 只是偶尔会用 ... 用法不外乎两种 ...

其一是用来生成一个规律的结构 ... 比如下面这样 ...

function gen() {
for ( $i = 0; $i < 5; ++ $i ) {
yield 1;
yield 2;
yield 3;
}
}

foreach( gen() as $gen ) echo $gen;

五个 123 只是示例 ... 生成的内容也可能是等差数列等比数列斐波那契数列一类的 ...

同理还能用来步进式的读文件 ... 避免直接把整个文件都读到内存里 ...

其二是用来挂起函数执行 ... 比如下面这样 ...

function logger( $file ) {
$f = fopen( $file, 'a' );
for ( ;;; ) {
$line = yield;
fwrite( $f, $line );
}
}
$log = logger( '/tmp/logger.log' );
$log->send("First");
$log->send("Second");
$log->send("Third");

这样可以避免每次都建立句柄或把句柄传递来传递去 ...
mikej
2015-01-18 00:54:20 +08:00
@Sunyanzi 涨姿势了,还有->send() 这种用法!

多谢,不过 for 循环里多了一个分号哈 : )
Sunyanzi
2015-01-18 01:01:40 +08:00
@mikej 啊是多了 ... 两段代码都是我直接在回复框里顺手打的 ... 没留神 ... ><

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/162506

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX