【问题标题】:Building A Log Reader with PHP RecursiveTreeIterator使用 PHP RecursiveTreeIterator 构建日志阅读器
【发布时间】:2012-03-17 10:17:21
【问题描述】:

我有这个日志目录结构

logs
-2012
--01
---01.php
---02.php
--02
---20.php
---23.php

我希望能够使用 PHP 的 RecursiveTreeIterator 来显示具有实际 php 文件(不是 dirs)的树作为显示文件内容的链接。

使用此问题中的第一个答案作为指导:Sorting files per directory using SPL's DirectoryTreeIterator

我对大部分 PHP 5 的 SPL 都是新手,所以我需要一些帮助。如何构建树?谢谢!

【问题讨论】:

  • 如果你只想列出文件,你不需要treeIterator。 treeIterator 用于打印 ASCII 树。
  • ASCII Library for Creating "Pretty" Directory Trees? 的可能重复项(删除 SELF_FIRST 常量,它应该只列出文件/叶子)
  • 我应该改写吗?我尝试了不同的方法,给出的链接和 DirectoryIterator 方法。 Gordon,有没有办法从这个 ASCII 树中检索文件信息,或者它只是打印?
  • @Ygam 就像我说的,treeIterator 将打印一个 ASCII 树。因此,您无法在 foreach 中获取迭代文件。但是,您可以使用 for 循环对其进行迭代,然后通过从 treeIterator 访问内部迭代器来访问迭代的文件。
  • 我是这样问的,以便我可以将文件显示为指向文件路径的链接

标签: php oop iterator directory-structure spl


【解决方案1】:

作为我在 cmets 中提供的链接的替代方案:

您还可以扩展 TreeIterator 的 current() 方法以提供额外的标记:

class LinkedRecursiveTreeIterator extends RecursiveTreeIterator
{
    public function current()
    {
        return str_replace(
            $this->getInnerIterator()->current(),
            sprintf(
                '<a href="%1$s">%1$s</a>',
                $this->getInnerIterator()->current()
            ),
            parent::current()
        );
    }
}

$treeIterator = new LinkedRecursiveTreeIterator(
    new RecursiveDirectoryIterator('/path/to/dir'),
    LinkedRecursiveTreeIterator::LEAVES_ONLY);

foreach($treeIterator as $val) echo $val, PHP_EOL;

上面将打印TreeIterator 打印的常规ASCII 树,但会将文件名包装到超链接中。请注意,$this-&gt;getInnerIterator()-&gt;current() 返回 File 对象,因此您也可以访问任何其他文件属性,例如文件大小、上次修改时间等。

【讨论】:

  • 就是这样!由于文档没有说太多,因此很难找到一种访问文件详细信息的方法。
猜你喜欢
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 2017-02-21
相关资源
最近更新 更多