PHP流上下文 - >如何在这种情况下使用?

时间:2012-09-07 00:17:57

标签: php json stream

我有一个系统可以将用户注释存储在自己的json文件中。我用scandir();在获取所有文件和文件夹的目录上,但如何将其限制为json文件,我不想要其他文件,如“。”和数组中的“..”,因为我需要准确的计数。

我查看了php.net上的信息,但无法弄清楚,也许你知道你可以指向我的资源,或者使用哪种功能。

2 个答案:

答案 0 :(得分:3)

这是PHP库拯救的一个可爱的例子。 FilterIterator是一个扩展和覆盖其accept方法的类,只使用您想要的文件。在这种情况下,我们使用标准FilesystemIterator来遍历目录。如果要在子目录中搜索json文件,也可以使用RecursiveDirectoryIterator。此示例迭代当前目录中的json文件:

class StorageFilterIterator extends FilterIterator {

    function accept() {
        $item = $this->getInnerIterator()->current();
        return $item->isFile() && $item->getExtension() === 'json';
    }

}

$storageFiles = new StorageFilterIterator(new FilesystemIterator(__DIR__));

foreach ($storageFiles as $item) {
    echo $item;
}

getExtension存在于PHP> = 5.3.6


标准PHP库(SPL)的另一个鲜为人知的部分是iterator_to_array。因此,如果您想要数组中的所有项而不是迭代它们,则可以执行以下操作:

$storageFiles = iterator_to_array(
    new StorageFilterIterator(new FilesystemIterator(__DIR__))
);

答案 1 :(得分:0)

没有流上下文参数可以帮助您过滤掉文件类型。

假设您的JSON文件使用.json扩展名保存,您只需根据文件扩展名过滤掉数组。

您可以使用readdir()构建文件列表,或者只是循环显示从scandir获得的结果,然后从中创建一个新数组。

以下是使用readdir的示例:

$files = array();
$dh = opendir($path);
while (($file = readdir($dh) !== false) {
    if (pathinfo($path . '/' . $file, PATHINFO_EXTENSION) !== 'json') continue;
    $files[] = $path . '/' . $file;
}

closedir($dh);

// $files now has an array of json files