繁体   English   中英

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

[英]PHP stream context -> how to use in this scenario?

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

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

这是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__))
);

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

假设您的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM