V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yakczh
V2EX  ›  PHP

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

  •  
  •   yakczh · 2014-04-14 12:47:10 +08:00 · 3345 次点击
    这是一个创建于 3910 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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;
    每次都是空的
    13 条回复    1970-01-01 08:00:00 +08:00
    vibbow
        1
    vibbow  
       2014-04-14 14:35:30 +08:00
    你这个用法怎么这么神奇...
    不是这样用的啊亲...
    你的get_one_to_three又不是class, -> 怎么可能好用...
    vibbow
        2
    vibbow  
       2014-04-14 14:38:55 +08:00
    本地还是5.4的环境,让我先搞个5.5的环境...
    vibbow
        3
    vibbow  
       2014-04-14 14:48:23 +08:00   ❤️ 1
    好吧,我的错。第一次用yield。
    以下是正确的,可以运行的代码:
    vibbow
        4
    vibbow  
       2014-04-14 14:48:51 +08:00
    hsu
        5
    hsu  
       2014-04-14 15:07:24 +08:00
    楼主。。。用VS写PHP方便吗?
    vibbow
        6
    vibbow  
       2014-04-14 15:14:22 +08:00
    @hsu 我购买了付费的PHP插件,写PHP非常方便。
    再配合Web Essential插件,无敌了...
    mx1700
        7
    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
        8
    mx1700  
       2014-04-14 15:39:37 +08:00
    上边错了,休整一下

    $generator->next(); 没有返回值,获取当前值需要用
    $key = $generator->key();
    $value = $generator->current();
    yakczh
        9
    yakczh  
    OP
       2014-04-14 16:13:47 +08:00
    那这个yield有什么用,
    直接
    $a=current($arr);
    next($arr),
    $b=current($arr)
    next($arr)
    就行了
    vibbow
        10
    vibbow  
       2014-04-14 16:45:38 +08:00
    @yakczh yield的作用,通俗点的非专业解释就是:
    在这里做断点,然后返回一个值。
    下次调用的时候再继续运行。
    yakczh
        11
    yakczh  
    OP
       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
        12
    bakac  
       2014-04-14 19:17:08 +08:00
    是想说 迭代器么
    yakczh
        13
    yakczh  
    OP
       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数目不定, 搜到一个替换一个值
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2835 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:29 · PVG 19:29 · LAX 03:29 · JFK 06:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.