duai0935 2018-06-19 18:13
浏览 71
已采纳

PHP:适用于数组,ArrayObjects和生成器的递归生成器

I'm making a trait for ArrayObject in PHP 5.6 that returns a generator that walks through the contents of the ArrayObject, recursing through any arrays, ArrayObjects and Generators that it finds. I'm having some trouble getting the logic down. Here's what I have so far:

trait Stream
{
   private function _streamOne($iterator)
   {
     foreach ($iterator as $key => $value) {
       if (is_array($value) || (is_object($value) && $value instanceof \Traversable)) {
         $this->_streamOne($value);
       } else {
         yield $key => $value;
       }
     }
   }
  public function stream()
  {
    return $this->_streamOne($this);
  }
}

Unit test:

final class StreamTestClass extends \ArrayObject
{
    use Stream;
}

$o = new StreamTestClass;
$o->offsetSet('alpha','blah');
$o->offsetSet('gamma',array('zeta'=>'yada','theta'=>'woot'));

$result = $o->stream();
$this->assertTrue($result->valid());
$this->assertEquals('alpha',$result->key());
$this->assertEquals('blah',$result->current());
$result->next();
$this->assertEquals('zeta',$result->key()); // fails asserting that null matches expected 'zeta'
$this->assertEquals('yada',$result->current());
$result->next();
$this->assertEquals('theta',$result->key());
$this->assertEquals('woot',$result->current());
$result->next();
$this->assertFalse($result->valid());

What do I need to do to make this work? The solution must work in PHP 5.6.

  • 写回答

1条回答 默认 最新

  • douci1615 2018-06-19 18:52
    关注

    You're not actually yielding anything for the recursion.

    trait Stream
    {
       private function _streamOne($iterator)
       {
         foreach ($iterator as $key => $value) {
           if (is_array($value) || (is_object($value) && $value instanceof \Traversable)) {
             // Change
             foreach($this->_streamOne($value) as $ikey => $ivalue) {
                 yield $ikey => $ivalue;
             }
             // End
           } else {
             yield $key => $value;
           }
         }
       }
      public function stream()
      {
        return $this->_streamOne($this);
      }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀