php - 在 PHP 中实现多级 "iterator"

标签 php oop class iterator nested-loops

我正在尝试创建一个类似 this one 的迭代器,对于评论列表:

// the iterator class, pretty much the same as the one from the php docs...
abstract class MyIterator implements Iterator{

  public $position = 0,
         $list;

  public function __construct($list) {
    $this->list = $list;
    $this->position = 0;
  }

  public function rewind() {
    $this->position = 0;
  }

  public function current() {
    return $this->list[$this->position];
  }

  public function key() {
    return $this->position;
  }

  public function next() {
    ++$this->position;
  }

  public function valid() {
    return isset($this->list[$this->position]);
  }
}

评论迭代器:

class MyCommentIterator extends MyIterator{

  public function current(){
    return new Comment($this->list[$this->position]);
  }    
}

这就是我使用它的方式:

$comments = GetComments(); // gets the comments from the db
if($comments): ?>

  <ol>
    <?php foreach(new MyCommentIterator($comments) as $comment): ?>
    <li>
      <p class="author"><?php echo $comment->author(); ?></p>

      <div class="content">
        <?php echo $comment->content(); ?>
      </div>

      <!-- check for child comments and display them -->

    </li>
    <?php endforeach; ?>
  </ol>

<?php endif; ?>

所以一切正常,除了一件事:我不知道如何处理嵌套评论:(

$comments array 返回一个简单的注释列表,例如:

[0] => object(
    'id' => 346,
    'parent' => 0,  // top level comment
    'author' => 'John',
    'content' => 'bla bla'         
  ),

[1] => object(
    'id' => 478,
    'parent' => 346,  // child comment of the comment with id =346
    'author' => 'John',
    'content' => 'bla bla'         
  )
...

我需要以某种方式能够检查子评论(在多个级别上)并将它们插入到 </li> 之前的家长评论...

有什么想法吗?

最佳答案

递归是你的 friend 。

displaycomment(comment):
    $html .= "<ol>" . comment->html;
    foreach comment->child:
        $html .= "<li>" . displaycomment(child) . "</li>";
    $html .= "</ol>";
    return $html;

本文中出现的所有代码都是伪代码。与真实代码的任何相似之处,无论是否有效,纯属巧合。

关于php - 在 PHP 中实现多级 "iterator",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6571324/

相关文章:

PHP 语法错误,意外 'endforeach' (T_ENDFOREACH)

php - SQLSTATE[HY000] : General error: 1215 Cannot add foreign key constraint laravel 9

c# - 什么应该进入顶级命名空间?

java - 将一个类中创建的对象访问到另一个类中

php - Codeigniter 和 Tank Auth - 新的注册字段被错误地添加到数据库中?

java - 如何在不创建实例的情况下访问类中的特定组件/方法

c++ - 头文件中的 "class example;"是什么意思?

javascript - 为什么要在 JavaScript 中创建一个没有构造函数并充满静态方法的类?

java - 二维数组在另一个类中保存一个类的对象

PHP Xml 属性解析