如何获取foreach循环中的迭代总数

5

可能有更好的方法来完成这个任务,我非常乐意听取建议。

我有一个文件上传脚本,可以处理多个上传。我想做的是计算循环为每个成功移动的文件进行迭代的次数,如果该数字等于上传的总文件数,则使用异常向用户显示已接收到的文件。

我认为我会在循环中递增,然后从那里开始计数,但我得到的是每个上传的文件的数组,这导致了错误的总数。是否有更好的方法来完成此操作或成功计算每个迭代?

这是我要处理的结构

    foreach($files as $file)
    {
        if ($file['error'] == UPLOAD_ERR_OK)
        {
            move_uploaded_file($file['tmp_name'], $filename);
        }
        else
        {
           //error
        }
    }

7
等一下…你是说你会使用异常来表示操作已成功吗? - Mark Byers
3
在编程中,使用异常来控制程序流程是非常糟糕的做法! - Mitch Wheat
好的,那么...我可以更改它。这只是非常方便而已。谢谢你提醒我。 - Timmay
2
在这种情况下,代码示例确实会有所帮助... - Sam Post
4个回答

3
你基本上需要使用计数器来完成它。
$success = 0;
foreach($_FILES as $file) {

    if(is_uploaded_file($file['tmp_name'])) {
        move_uploaded_file($file['tmp_name'], $destination);
        $success += 1;
    }
}

if($success != count($_FILES)) {
    //error message / exception
}

编辑 - 您可以在错误处理中设置错误标志,但实际上没有一种方法是非常好的。

foreach($files as $file)
{
    if ($file['error'] == UPLOAD_ERR_OK)
    {
        move_uploaded_file($file['tmp_name'], $filename);
    }
    else
    {
       //error
       $upload_errors += 1;
       //or, to get a little more info...
       //$upload_errors[] = $file
    }
}

if( $upload_errors == 0) { //or count($upload_errors) == 0
    // tell the user that the upload failed.
}

谢谢Dave。我已经尝试使用计数器,但是我首先检查$_FILES['error']是否存在错误。如果有错误,那么我会抛出异常。我将在一分钟内发布一些代码,请查看。 - Timmay
我认为没有更好的方法来做这件事。当然,如果有的话,我想看看。 - davethegr8
谢谢Dave。使用您的示例,这会阻止我在else块中使用异常吗? - Timmay
Dave,在foreach循环之外,我只是返回一个成功的消息,这个方法可以工作。但显然不是最优的,因为我希望能够向用户回显已成功上传的文件名。这就是为什么我想在循环内部完成此操作,因为我可以访问文件名。 - Timmay
@Timmay - 哦,我明白了。为什么不向会话变量添加一条消息呢?例如:$_SESSION['file_error'] = '(您的消息在此)'; 然后在您的视图中,echo $_SESSION['file_error']; 这是一个相当标准化的方法。 - davethegr8

0

在这里,你可以看到你可以使用 count($_FILES) 来计算上传文件的数量。但请注意,这并不是正确上传文件的数量。

<?php
if (isset($_FILES) && !empty($_FILES)) {
    echo count($_FILES).' files were uploaded<br>';
    ?><pre><?php
    print_r($_FILES);
    ?></pre><?php

}
?>
<form 
    action="<?php echo $_SERVER['PHP_SELF'];?>" 
    method="post"
    enctype="multipart/form-data"
>
    File 1<input type="file" name="file1"><br>
    File 2<input type="file" name="file2"><br>
    File 3<input type="file" name="file3"><br>
    <input type="submit" value="upload">
</form>

Niels,感谢您的示例。当我上传两个文件时,我得到的是“2”的计数2倍。换句话说,每次迭代都会出现一个“2”。难道没有一种方法只计数一次吗? - Timmay
抱歉,我不太明白您的意思,能否给一个代码示例呢?或者,如果您已经标记了一个答案为正确答案,那就不用管了。 - Niels Bom

0

foreach ($array as &$item)

你可以直接使用count($array)


谢谢保罗,但正如我上面所说的,那样做并不能产生正确的结果。我得到了每个上传的文件的数组。如果它是一个单一的数组,那就可以工作了。我只是似乎无法得到正确的数组。 - Timmay
这就是我们所说的多维或嵌套数组。因此,对于上传的每个文件,您都会在$_FILES数组中获得另一个数组。 $_FILES中的每个单独的数组都包含有关特定文件的信息。而且您可以计算$_FILES中的数量,没有问题。 - Niels Bom
是的,我非常熟悉多维数组。使用 $_FILES 数组的默认结构,在上传多个文件时,如果不先重新排列该数组,则无法实现这一点。 - Timmay

0

既然你知道文件数量,就可以使用一个for循环来处理。使用两个计数器,一个用于循环,另一个用于成功次数。除非你的脚本大部分时间都失败了(并且你想知道一切都正常工作是多么不寻常),否则不要在一切正常时抛出异常。


嗯,那很有道理。但是我该如何使用两个计数器呢? - Timmay

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