清除空数组元素

3

我正在处理 $_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数组元素?

你能否添加一个打印出带有空元素的数组?使用 print_r($_FILES); 的结果即可。 - IOrlandoni
5个回答

5

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

foreach( $_FILES['images']['name'] as $key => $value ) {
    if( empty($value) ) {
        unset( $_FILES['images']['name'][$key] );
    }
}

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)

1
这个非循环的答案怎么样?
$in = $_FILES['images']['name'];
$out = array_filter($in);

或者如果您更喜欢一行代码:
$out = array_filter($_FILES['images']['name']);

来自array_filter函数的手册页面

"如果未提供回调函数,则将删除所有等于FALSE(参见转换为布尔值)的输入条目。"


0
除了没有人的答案之外,如果您还想从typetmp_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);

жҠұжӯүпјҢжҲ‘еә”иҜҘжӣҙеҠ е…·дҪ“гҖӮ$_FILES['images']['name']жҳҜдёҖдёӘж•°з»„пјҢеҰӮдёӢжүҖзӨәзҡ„print_rпјҡhttp://pastebin.com/JYmCvYBU - John

0

使用错误代码最佳

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

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

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接