【问题标题】:Split lists in batches分批拆分列表
【发布时间】:2018-02-04 11:04:21
【问题描述】:

这听起来很简单,但有时它的简单事情却很难实现。至少我找不到使用 PHP 进行清理的正确方法,我搜索了不同的函数。

我有一个从文件中读取的项目列表。例如:

foreach(file('items.txt') as $line) {
// Do something here with $line;
}

假设此文本列表(逐行读取)具有特定数量的项目,50、10,000 或 9,444,我如何将它们分成更小的批次?

例如,将它们分成每批 100 个。我基本上想读取 items.txt 并将项目写入较小的文件,例如 items1.txt、items2.txt、items3.txt 等。每个包含相同数量的项目,除了最后一个文件包含较少的项目,因为我们不知道要拆分的项目总数。

【问题讨论】:

标签: php


【解决方案1】:

您可以使用array_chunk() 自动将您的行数组拆分为特定大小的子数组。

例子

$chunks = array_chunk(file('items.txt'), 100);
foreach ($chunks as $chunk) {
   foreach($chunk as $line) {
   // Do something here with $line;
   }
}

【讨论】:

  • 这仅适用于已经在内存中的数组,如果您尝试将一个太大而无法放入内存的文件分块,它将不起作用。
  • 是的,但这不是这个问题的一部分
  • 没错但我觉得这是一个值得注意的免责声明。
  • 其实apokryfos是对的。拆分成批次的主要原因是列表很大,最终可能不适合内存。可以处理小批量。我尽量让问题尽可能简短。
  • 10000 甚至 100000 个项目并不是非常庞大。但我同意其余的。 @nibb11
【解决方案2】:

我建议你有一个计数器变量来计算你添加了多少行。每当它达到您的阈值时,您应该对该数据执行一些操作,然后清理数组并将计数器重置为零。

这也取决于您要达到的目标。如果您在中途遇到内存不足错误,这是由于每次迭代都发送电子邮件之类的。您可以通过在每次操作后添加延迟(睡眠)来解决它。

希望对你有所帮助。

【讨论】: