【问题标题】:php count input files array size without foreachphp计算输入文件数组大小,没有foreach
【发布时间】:2025-12-26 01:45:06
【问题描述】:

对于我尝试上传多个文件的 laravel 项目。这些文件是可选的,所以我想在遍历所有图像之前进行检查。

我的表单输入部分。

{!! Form::open(array( 'files'=>true)) !!}
  {!! Form::file('images[]', array('multiple'=>true, 'class' => 'form-control')) !!}
{!! Form::close() !!}

(表单有 enctype="multipart/form-data" 输入字段有 multiple="1")

我当前的检查代码:

$files = Input::file('images');
$uploaded = 0;
$failed = 0;
if(!empty($files)){
    try {
         foreach ($files as $file) {
            //upload file $uploaded ++ or $failed ++;
            $rules = array('file' => 'required|image'); // 'required|mimes:png,gif,jpeg,txt,pdf,doc'
            $validator = Validator::make(array('file' => $file), $rules);
            if ($validator->passes()) {
              //if file uploaded succesfuly $uploaded++;
            }
            else{
               $failed++;
            }
         }
    }
    catch(Exception e){
        //Handle error
    }
}

当我用 if(count($files) > 0) 更改 !empty($files) 时,它仍然会进入 foreach。

我使用 $failed 和 $uploaded,在这部分代码完成后,根据失败/上传的数量显示一条消息。但是,当我不选择任何文件时,$failed 为 1(即使数组为空)。循环 $files 以计算数量,在我循环它们上传之前感觉就像浪费内存/时间/等,有没有比循环 $files 数组来获取文件数量更好的方法?

子问题:为什么它为空时运行foreach循环?

【问题讨论】:

  • 为什么是$failed is 1 (even if array is empty)
  • @u_mulder 查看编辑(我有一个验证器在上传之前检查 $files 是否是有效图像
  • 要知道数组的大小(=它的元素个数),可以使用函数count。 count($files) 将告诉 $files 数组中的项目数。请注意,数组可能包含 null 或空白项。例如:$files = array();$files[0] = "";这将计数为 1(并且将满足 !empty($files) 条件)。我猜你的循环是用空元素运行的。您应该检查给定的 $file 变量是否不是空/空字符串。
  • @varocarbas 但是如果它是空的,为什么它会进入foreach?
  • 注意编辑我试过的地方 if(count($files > 0))

标签: php arrays input


【解决方案1】:

我假设您的精简表格看起来像这样:

<form method="POST" action="target/url" accept-charset="UTF-8" enctype="multipart/form-data">
    <input name="images[]" type="file">
    <input name="images[]" type="file">
    <input type="submit" value="Click Me">
</form>

在这种情况下,您的 $images 变量将始终是一个数组。文件上传的结果是数组中的条目。如果您要提交上述表单并运行以下代码:

$files = Input::file('images');
dd($files);

你会得到:

array:2 [
    0 => null
    1 => null
]

如您所见,您的 $images 数组不为空。它有两个条目,每个文件上传一个。

所以,您有几个选择。你可以移动你的空支票:

$files = Input::file('images');
foreach ($files as $file) {
    // check to see if the file upload is empty
    if (!empty($file)) {
        $rules = array('file' => 'required|image'); // 'required|mimes:png,gif,jpeg,txt,pdf,doc'
        $validator = Validator::make(array('file' => $file), $rules);
        if ($validator->passes()) {
            // success
        } else {
            // fail
        }
    }
}

或者,您可以使用 array_filter() 预先过滤掉所有空结果:

// filter out all loosely-false entries (null == false)
$files = array_filter(Input::file('images'));
foreach ($files as $file) {
    $rules = array('file' => 'required|image'); // 'required|mimes:png,gif,jpeg,txt,pdf,doc'
    $validator = Validator::make(array('file' => $file), $rules);
    if ($validator->passes()) {
        // success
    } else {
        // fail
    }
}

【讨论】:

  • 查看我的编辑,我有一个包含多个文件的输入字段