0

当我输出这些 txt 文件时,我试图按每个县文件的计数限制按唯一县对它们进行分组。例如,假设查询在此可访问的结果字段中返回 2 个唯一县:$row['county_txt'].. 假设我将$per_file限制设置为 2500。我的脚本现在使用 per_file 等,但不适用于县分组。下面是我所在位置的一些混搭。感谢您提供帮助我解决此问题的任何指导。

输出示例:


绿县 - 总绿县结果 2900 输出将是 2 个文件。

输出文件将是:

绿色-#1-20130627-2500.txt 绿色
-#2-20130627-400.txt


红县 - 红县总结果 12650 输出将是 5 个文件。

输出文件将是:

红色-
#1-20130627-2500.txt 红色- #2-20130627-2500.txt 红色-#
3-20130627-2500.txt 红色-
#4-20130627-2500.txt 红色-
#5-20130627-150.txt


... // earlier part of script
     // Functions I've been attempting

$county[] = $row['county_txt'];

function unique_county() {
    foreach($county as $unq_cnty) {
    echo $unq_cnty;
return $unq_cnty;
}

} 

 function get_unique_county() {
    $column = array();
    while($row = mysql_fetch_array($result)){
        $column[] = array_unique($row['county_txt']);
    echo $column;
}
}

get_unique_county();

$file_count = 1;
$recs = 0;
$per_file = 2500;
$footer = "FOOTER";
$default_contents = $contents = array("BODY CONTENT TOP");

while ($row = mysql_fetch_array($result)) {
    $line = "...";
    $contents[] = $line; // Each array element will be a line in the text file
    $i++;
    $recs++;

    if ($county == $unq_cnty && $i == $per_file) {
    $contents[] = $footer; // Add the footer to the end
    file_put_contents($unq_county . "-#" . $file_count .  "-" . date('Y') . "-" . $recs .  '.txt', implode("\r\n", $contents));
        $i = 0;
        $recs = 0;
        $contents = $default_contents;
        $file_count++;
    } // End of if()
} // End of while()
4

2 回答 2

0

您需要一个计数器,然后才能重置它(重置后,您保存文件)。

示例(未经测试,仅示例):

<?php
$rowCounter = 0;
$fileCounter = 1;
$startID = md5(microtime(1));
$fp = fopen("{$startID}.txt", "w");
while ($row = mysql_fetch_array($result)) {
  $rowCounter++;
  fwrite($fp, $row['county_txt']."\r\n");
  if($rowCounter == 2500) {
    fclose($fp);
    if($startID) {
      rename("{$startID}.txt", "Red-#{$fileCounter}-".date("Ymd")."-{$rowCounter}.txt");
      $startID = md5(microtime(1));
    }
    $fp = fopen("{$startID}.txt", "w");
    $rowCounter = 0;
    $fileCounter++;
  }
}
// Save last file
fclose($fp);
rename("{$startID}.txt", "Red-#{$fileCounter}-".date("Ymd")."-{$rowCounter}.txt");
?>

请注意,不要使用mysql_*函数。相反,mysqli至少使用,或PDO

于 2013-07-02T17:42:21.670 回答
0

不太确定你想在这里做什么,但似乎你让事情变得比需要的更难。从本质上讲,您似乎需要使用二维数组。那么,为什么不直接查询数据库并将数据读入二维数组,而不是跳过所有这些额外的环节(即确定唯一数组值的函数等)?

所以你的代码可能看起来像这样:

$county_array = array()

while ($row = [YOUR DATABASE ROW FETCHING MECHANISM HERE]) {
    $county_array[$row['county_name']][] = $row; // you can change $row here to whatever data you actually need to store.
}

$limit = 2500;
foreach ($county_array as $county_name => $county_array) {
    $temp_array = array();
    $i = 0;
    foreach ($county_array as $item) {
        $temp_array[] = $item;
        $i++;
        if ($i === $limit) {
            // we reached file limit, so write it to file code omitted for this
            $temp_array = array();
            $i = 0;
        }
    }

    if (count($temp_array) > 0) {
        // there are still items in temp array so write them to file code omitted for this
    }
}

如果您实际上在查询中按国家/地区名称排序并在读取县名称时检测值的更改(并因此启动一个新文件),您实际上可以直接写入从数据库读取的循环中的文件,从而节省内存开销.

于 2013-07-02T17:43:17.287 回答