使用PHP从文件和目录数组中删除文件

使用PHP从文件和目录数组中删除文件,php,arrays,file,directory,Php,Arrays,File,Directory,我正试图通过使用scandir并从阵列中删除文件来获取路径中的目录列表,但我的echo出现了错误 我在用密码 $path = "Calltypes/"; $files = scandir($path); $files = array_diff(scandir($path), array('.', '..')); for($i = 0; $i < sizeof($files); $i++) { if(!is_dir($files[$i])) array_splice

我正试图通过使用
scandir
并从阵列中删除文件来获取路径中的目录列表,但我的echo出现了错误

我在用密码

$path = "Calltypes/";
$files = scandir($path);
$files = array_diff(scandir($path), array('.', '..'));

for($i = 0; $i < sizeof($files); $i++) {
    if(!is_dir($files[$i]))
        array_splice($files, $i, 1);
}

echo sizeof($files);
Calltypes/路径有3个文件夹和1个txt文件

编辑:第32行为

if(!is_dir($files[$i]))

您可以使用
foreach
而不是
for
。然后使用
unset
,因为
array\u-splice
会重新排列键,所以会出现错误

$path = "Calltypes/";
$files = scandir($path);
$files = array_diff(scandir($path), array('.', '..'));

foreach ($files as $key => $value) {
    if(!is_dir($path.$files[$key]))
       unset($files[$key]);
}
echo sizeof($files);

在您的情况下,
注意:发生未定义的偏移量:0
,因为
arry_diff
返回一个数组,该数组包含第一个数组中的所有条目,而无需重新编制索引。这意味着,
array\u diff
处理后,
$files
数组将不会有
0
索引

在循环中迭代时,不要“拼接”数组项-使用
array\u filter
仅获取目录名:

$path = "Calltypes/";
$files = scandir($path);
$files = array_diff(scandir($path), array('.', '..'));

$files = array_filter($files, "is_dir");

我会使用@RomanPerekhrest的解决方案,但您实际的问题是因为在调用
array_diff()
之后,索引为0的元素不再存在。使用此方法,我的echo大小为“0”。这不可能是正确的,因为我有3个文件夹和1个txt文件,所以过滤器后的大小应该是3?@AdamStück您应该
var_dump($files)在每一步后查看发生了什么。@AdamStück,这不应该发生。你做错了什么。你还有一些与我的方法无关的问题我使用了你的代码片段,只添加了一个
echo sizeof($files)在结尾,所以没有你不知道的代码被使用。@AdamStück,错了,我的代码有效。。。除了您当前的条件/技巧之外,这很有效,但我必须使用if(!is_dir($path.$files[$key]))
$path = "Calltypes/";
$files = scandir($path);
$files = array_diff(scandir($path), array('.', '..'));

$files = array_filter($files, "is_dir");