您好我创建了一个使用其扩展名删除所有文件的方法。
这是代码
function RemoveAllFiles($extensions)
{
foreach($extensions as $extension)
{
$files = glob("*.".$extension."");
foreach($files as $file)
{
unlink($file);
}
}
}
我正在这样打电话
$commonObj = new CommonUtility();
$extesions = array("zip","xlsx");
$commonObj->RemoveAllFiles($extesions);
如果存在两个文件,它的工作正常我还会收到此错误
Warning: Invalid argument supplied for foreach() in CommonUtilities.class.php on line 356
任何帮助将不胜感激。
答案 0 :(得分:1)
glob
可能会因错误而返回false
;此值不是foreach
的有效主题,会引起您提及的警告。
此外,glob
也可能会返回false
,即使一切都与任何文件都不匹配也没问题:
注意:
在某些系统上,无法区分空匹配 和一个错误。
为了保护自己,只需使用过滤掉foreach
值的条件保护false
,例如:
$files = glob("*.".$extension."");
if (!$files) {
continue; // do nothing if error or no files match
}
foreach($files as $file)
{
unlink($file);
}
答案 1 :(得分:1)
虽然它的回答相似:
function removeAllFiles(array $extensions) {
foreach(array_filter($extensions) as $extension) {
$files = glob("*.{$extension}");
if (is_array($files) {
foreach($files as $file) {
unlink($file);
}
}
}
}
论证中array
的类型提示将第一个foreach
与同一问题隔离开来。同样,is_array($files)
隔离第二个。 count($files)
不是必需的,因为在给定空数组的情况下将跳过第二个foreach
块。
array_filter($extensions)
会删除“falsey”值,包括false
,null
和""
,这些值可能会阻止"*."
传递给glob
"0"
。你可能想省略这个,因为我不记得(快速测试显示"0"
是否会被过滤"false"
将被过滤,以及*.0
等等)会过滤掉“removeAllFiles(["foo"]); // no problem
removeAllFiles(["foo", "bar"]); // also no problem
removeAllFiles("foo"); // problem! has to be an array
removeAllFiles([false, null, ""]); // no problem, but no action; filtered
removeAllFiles([false, null, "foo"]); // no problem, only "foo"
”作为掩码 - 一个完全有效的扩展名。
{{1}}
答案 2 :(得分:0)
尝试以下代码
function RemoveAllFiles($extensions)
{
foreach($extensions as $extension)
{
$files = glob("*.".$extension."");
usort($files, function($a, $b) { return filemtime($a) - filemtime($b); });
array_pop($files);
array_map('unlink', $files);
}
}
$commonObj = new CommonUtility();
$extesions = array("zip","xlsx");
$commonObj->RemoveAllFiles($extesions);
答案 3 :(得分:0)
if(is_array($files)){
foreach($files as $file)
{
unlink($file);
}
}
它检查$files
是否为数组,否则不执行foreach