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);

它不断返回这个

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

但我希望它返回以下

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

解决方案:

安德鲁建议我使用FilesystemIterator::UNIX_PATHS解决了这个问题

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

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

FilesystemIterator::UNIX_PATHS

设置使SPL始终返回'以清除不确定性;并且替换为CCD_ 8而不是CCD_。这也是我最初遇到的许多麻烦:)