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 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器