str_replace 变量作为针不工作我做错了什么

str_replace with variable as needle not working what do I do wrong

我尝试为示例索引一个目录,它看起来像 files/subdir/file.txt 只有一个子目录和文件。我将第一个目录存储在 $dir = "files/" 中然后想要一个文件的目录减去 $dir 中的值我用 $curdir = str_replace( $dir, '', $file->getPath() ) 尝试过但是当我用 $curdir = str_replace( 'files/', '', $file->getPath() ) 尝试它时它不起作用它确实有效,为什么这是我所缺少的?

清除

<?php
$dir = 'files/';
$files = new ArrayObject();
$dir_iterator = new RecursiveDirectoryIterator($dir);
$iterator = new RecursiveIteratorIterator($dir_iterator,RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $file) {
    if( $file->getFilename()[0] == '.' ){ continue; }

    $curdir = str_replace( $dir, '', $file->getPath() );
    $files[$curdir][] = $file;

}
print_r($files);

它一直在 returning 这个

ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [files/subdir] => Array
                (
                    [0] => SplFileInfo Object
                        (
                            [pathName:SplFileInfo:private] => files\subdir\file.txt
                            [fileName:SplFileInfo:private] => file.txt
                        )
                )
        )
)

但是我想要的return是下面的

ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [subdir] => Array
                (
                    [0] => SplFileInfo Object
                        (
                            [pathName:SplFileInfo:private] => files/subdir\file.txt
                            [fileName:SplFileInfo:private] => file.txt
                        )
                )
        )
)

解决方案:

Andrew 建议使用 FilesystemIterator::UNIX_PATHS 解决了我的问题。

$dir_iterator = new RecursiveDirectoryIterator($dir, FilesystemIterator::UNIX_PATHS);

我认为问题在于 SPL 根据系统默认值在文件路径中 returning \,因此设置

FilesystemIterator::UNIX_PATHS

set make SPL always return \ 清除不确定性;并且替换为 / 而不是 \ 替换字符串时可能不会搜索匹配项。这也是我一开始遇到很多麻烦的原因:)