【问题标题】:Unsetting empty array elements取消设置空数组元素
【发布时间】:2011-11-02 08:32:13
【问题描述】:

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

我试过这些代码sn-ps:

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); 的结果就可以了。

标签: php arrays unset


【解决方案1】:

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

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

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

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

来自manual page for array_filter

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      最好使用错误码

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

      【讨论】:

        【解决方案4】:

        首先,您的问题并不具体,因为如果您正在使用单个文件,则不需要 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)
        

        【讨论】:

          【解决方案5】:

          除了没人回答,如果你还想从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 所示:pastebin.com/JYmCvYBU
          猜你喜欢
          • 1970-01-01
          • 2018-07-16
          • 2014-09-21
          • 2016-04-30
          • 1970-01-01
          • 2011-02-20
          • 2011-04-09
          • 2013-04-11
          • 2021-05-29
          相关资源
          最近更新 更多