2

我正在使用$_FILES,有时由于我的表单上的空文件输入,该数组具有空数组元素。我正在尝试取消设置这些元素。

我试过这些代码片段:

foreach($_FILES['images']['name'] as $image)
{
    if(empty($image))
    {
        unset($image);
    }
}

foreach($_FILES['images']['name'] as $image)
{
    if($image == "")
    {
        unset($image);
    }
}

foreach($_FILES['images']['name'] as $image)
{
    if(!$image)
    {
        unset($image);
    }
}

但是数组总是返回空元素。实际上是否有一种用 PHP 删除空 $_FILES 数组元素的合理方法?

4

5 回答 5

5

当您使用foreach($_FILES['images']['name'] as $image)语句 $image 成为数组中实际元素的副本时,您所做的是取消设置该副本,您应该这样做:

foreach( $_FILES['images']['name'] as $key => $value ) {
    if( empty($value) ) {
        unset( $_FILES['images']['name'][$key] );
    }
}
于 2011-08-23T22:31:38.180 回答
1

首先,您的问题并不具体,因为如果您正在使用单个文件,则不需要 foreach( ($_FILES['images']['name'] as $image)。再次,您在表单中提到了空字段,这应该会触发案例4错误。那是没有上传文件。所以你的错误方法是这样设置的

if($_FILES['upload']['error'] > 0){
echo 'the file couldnt be uploaded because';
 switch($_FILES['upload']['error']){
  case 1:
 print 'the file exceeds max size in php.ini';
 break;
 case 2:
  print 'the file exceeds max size in html settings';
 break;
  case 3:
 print 'the file was partially uploaded';
 break;
 case 4:
 print 'no file was uploaded';
 break;
 case 6:
 print 'no temporary folder available';
 break;
 case 7:
  print 'unable to write to disk';
 break;
 case 8:
print 'file upload stopped';
 break;
default:
print 'a sys error occured';
break;

这样会通知一个错误,并且您知道已上传一个空图像。为自己节省 UNSET() 的压力。如果是多次上传,你会有类似的东西

foreach ($_FILES['upload']['name'] as $number => $filename)
于 2011-08-23T22:43:18.297 回答
0

除了没人回答之外,如果您还想从 , 等数组中删除元素,type请使用tmp_namesize

// Before stripping
print_r($_FILES);

$length = count($_FILES['images']['name']);
for($i = 0; $i < $length; $i++){
    if(empty($_FILES['images']['name'][$i]))
        foreach($_FILES['images'] as $key => $value)
        unset($_FILES['images'][$key][$i]);
}

// After stripping
print_r($_FILES);
于 2011-08-23T22:32:21.743 回答
0

最好使用错误代码

foreach( $_FILES['images']['error'] as $key => $value ) {

    if($value==0) { 
      // file good do code
    } else { 
    unset( $_FILES['images']['name'][$key] );
    }

    }
于 2011-08-23T22:49:17.500 回答
0

这个非循环的答案怎么样?

$in = $_FILES['images']['name'];
$out = array_filter($in);

或者,如果您更喜欢一行:

$out = array_filter($_FILES['images']['name']);

手册页array_filter

“如果没有提供回调,所有等于 FALSE 的输入条目(请参阅转换为布尔值)都将被删除。”

于 2013-04-16T20:25:56.980 回答