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 \
清除不确定性;并且替换为 /
而不是 \
替换字符串时可能不会搜索匹配项。这也是我一开始遇到很多麻烦的原因:)
我尝试为示例索引一个目录,它看起来像 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 \
清除不确定性;并且替换为 /
而不是 \
替换字符串时可能不会搜索匹配项。这也是我一开始遇到很多麻烦的原因:)