PHP 遍历元素并分批处理

读取一个 txt 文本文件,里面是一行一个 userid,需要给这些用户发送文件(做什么不重要),发送文件接口支持一次最多发 10 个用户,所以需要分批发送,每 10 个 userid 作为一批。

这种场景很常见,尤其是一次处理量太大了需要分批的情况。其实类似于如下例子,遍历每个数字,每 5 个作为一组(这里是 10 个):

1 2 3 4 5 | 6 7 8 9 10 | 11 12 13 14 15 | 16 17 18

基本思想就是:遍历的时候计数,取模可以知道是否满足 10 个,每 10 个一发送。但是要注意最后如果存在剩余不足 10 个的情况不能漏了。代码如下:

$uidFile = storage_path('app/public') . DIRECTORY_SEPARATOR . $task['uid_file'];
$count = 0;
$max = 10;

//分批发送
foreach (file($uidFile) as $line) {
    $userID = intval($line);
    if ($userID <= 0) {
        continue;
    }
    $userIDs[] = $userID;
    $count++;
    if ($count % $max == 0) {
        $this->sendMail($userIDs, $files, (string)$task['note'], (int)$task['reward'], $task);
        $userIDs = [];
    }
}

if ($userIDs) {
    $this->sendMail($userIDs, $files, (string)$task['note'], (int)$task['reward'], $task);
}

省略上下文。

(随手记录一下代码片段,以备日后参考,原文地址:https://blog.tanteng.me/2017/10/php-foreac...

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5

这样会不会稍简单些?

        $uidFile = storage_path('app/public') . DIRECTORY_SEPARATOR . $task['uid_file'];
        $line = file($uidFile);
        $collect = collect($line)->chunk(10);
        foreach ($collect as $userIDs) {
            $this->sendMail($userIDs, $files, (string)$task['note'], (int)$task['reward'], $task);
        }
7年前 评论

@qufo 嗯,这个方式很有Lavarel风格,也更简洁,可以作为补充!

试了一下,能符合要求。

        $testArr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23];
        $line = collect($testArr)->chunk(10);
        foreach ($line as $item) {
            dump($item->toArray());
        }
7年前 评论

array_chunk也一样可以做到!

7年前 评论

原生数组切割函数嘛

7年前 评论

直接将整个文件读取到数组中,难道就没人考虑文件中数据量的大小问题了吗?

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!