php 的 yeild 怎么象 next 那样每次运行取出一个值?

2014-04-14 12:47:10 +08:00
 yakczh
def seq1():
for i in range(1,100):
yield i

s=seq1()
print(s.next())
print(s.next())
print(s.next())
print(s.next())

每次运行会出来一个值

function gen_one_to_three() {
for ($i = 1; $i <= 3; $i++) {
// Note that $i is preserved between yields.
yield $i;
}
}
$generator = gen_one_to_three();


echo "\n----", $generator->next();
exit;
每次都是空的
3319 次点击
所在节点    PHP
13 条回复
vibbow
2014-04-14 14:35:30 +08:00
你这个用法怎么这么神奇...
不是这样用的啊亲...
你的get_one_to_three又不是class, -> 怎么可能好用...
vibbow
2014-04-14 14:38:55 +08:00
本地还是5.4的环境,让我先搞个5.5的环境...
vibbow
2014-04-14 14:48:23 +08:00
好吧,我的错。第一次用yield。
以下是正确的,可以运行的代码:
vibbow
2014-04-14 14:48:51 +08:00
hsu
2014-04-14 15:07:24 +08:00
楼主。。。用VS写PHP方便吗?
vibbow
2014-04-14 15:14:22 +08:00
@hsu 我购买了付费的PHP插件,写PHP非常方便。
再配合Web Essential插件,无敌了...
mx1700
2014-04-14 15:37:44 +08:00
$generator->next(); 没有返回值,获取当前值需要用
$key = $generator = $list->key();
$value = $generator = $list->current();

遍历元素最方便的方法是用foreach,如果有while,大概是这样
$list->rewind();
while ($list->valid())
{
$key = $list->key();
$value = $list->current();
var_dump($key, $value);
$list->next();
}

http://www.php.net/manual/zh/class.iterator.php
mx1700
2014-04-14 15:39:37 +08:00
上边错了,休整一下

$generator->next(); 没有返回值,获取当前值需要用
$key = $generator->key();
$value = $generator->current();
yakczh
2014-04-14 16:13:47 +08:00
那这个yield有什么用,
直接
$a=current($arr);
next($arr),
$b=current($arr)
next($arr)
就行了
vibbow
2014-04-14 16:45:38 +08:00
@yakczh yield的作用,通俗点的非专业解释就是:
在这里做断点,然后返回一个值。
下次调用的时候再继续运行。
yakczh
2014-04-14 18:02:40 +08:00
function breakpoint(){
yield 5;
yield 6;
yield 7;
yield 8;



}

$a=breakpoint();
echo "\n";

print $a->current();

$a->next();
echo "\n";
print $a->current();
$a->next();
echo "\n";
print $a->current();
明显python简练一些
bakac
2014-04-14 19:17:08 +08:00
是想说 迭代器么
yakczh
2014-04-14 20:41:58 +08:00
@bakac 有时候不是一次性遍历完,而是在程序逻辑中逐个取值 ,比如处理 模板
$tpl=" there is some {?} {?} "
$arr=array('aa','bb');
#$arr=array(111,222,3333,444);

function render($tpk,$data){
...
}
$arr数目不定, 搜到一个替换一个值

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

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

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

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

© 2021 V2EX