Hi我创建了一个使用扩展名删除所有文件的方法。
这是代码
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
任何帮助都将不胜感激。
glob
可以在出错时返回false
;此值不是foreach
的有效主题,将导致您提到的警告。
此外,glob
也可能返回false
,即使当它与任何文件都不匹配时一切都很好:
注:
在某些系统中,无法区分空匹配以及一个错误。
为了保护自己,只需使用过滤掉false
值的条件来保护foreach
,例如:
$files = glob("*.".$extension."");
if (!$files) {
continue; // do nothing if error or no files match
}
foreach($files as $file)
{
unlink($file);
}
虽然答案类似:
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)
将删除"伪"值,包括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"
尝试以下代码
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);
if(is_array($files)){
foreach($files as $file)
{
unlink($file);
}
}
它检查$files
是否为数组,否则不执行每个