Php 计算平面文件中的唯一值并将其更新为数组

Php 计算平面文件中的唯一值并将其更新为数组,php,arrays,algorithm,flat-file,Php,Arrays,Algorithm,Flat File,计算管道分隔平面文件中唯一名称和最后一次出现(来自数据)的最合理方法是什么,其中数据的格式如下: Artist|YYYY-MM-DD|Location|\n $bands = array( 'Le Artist' => array('count' => 1, 'year' => 1999), ... ); 因此,例如,当数据为(末尾有换行符)时: 理想的格式是: Artist|Times listed|Latest year 如何循环通过平面文件将以下数据

计算管道分隔平面文件中唯一名称和最后一次出现(来自数据)的最合理方法是什么,其中数据的格式如下:

Artist|YYYY-MM-DD|Location|\n
$bands = array(
    'Le Artist' => array('count' => 1, 'year' => 1999),
    ...
);
因此,例如,当数据为(末尾有换行符)时:

理想的格式是:

Artist|Times listed|Latest year
如何循环通过平面文件将以下数据获取到第二个平面文件中:

Le Artist|1|1999|
Soundmakers|3|2012|
The Band|2|2011|
起初我认为这是一项相当简单的任务,但结果证明它更具挑战性

我有一个半成品的实现(有些项目写了两次,有时年份错了!),所以我想看看是否有更好的方法来实现这一点

为此,我尝试了面向对象和过程方法,到目前为止,我在过程方法方面取得了更好的效果。但对我来说,这种方法真的不重要,因为这是我个人的学习(和使用)

更新:
该文件大约为1 MB,在任何可预见的未来都将远远小于10 MB。

首先,制作一个以艺术家姓名为键的数组,并列出年份作为值:

$grouped = array();

while (!feof($fd) && $line = fgets($fd)) {
    list($artist, $date) = explode('|', $line);
    list($year) = explode('-', $date);

    $grouped[$artist][] = $year;
}
然后输出结果:

foreach ($grouped as $artist => $years) {
    printf("%s|%s|%s|\n", $artist, count($years), max($years));
}

看起来确实很简单。您需要将结果存储在如下数组中:

Artist|YYYY-MM-DD|Location|\n
$bands = array(
    'Le Artist' => array('count' => 1, 'year' => 1999),
    ...
);
您可以使用来读入这些行,同时将它们分开:

$line = fgetcsv($fh, 0, '|');
然后,您可以检查是否已经拥有此艺术家并增加计数:

$artist = $line[0];
if (!isset($bands[$artist])) {
    $bands[$artist] = array('count' => 0, 'year' => null);
}
$bands[$artist]['count']++;

对于年份,只需分解
$line[1]
提取年份,检查它是否大于
$bands[$artist]['year']
,如果大于,则替换它。

这是我最终使用的版本,它按照我的期望工作:

<?php
$file = 'seen.txt';
$shows = array();
$sourceData = file($file);
foreach($sourceData as $row) {
    list($date, $artist, $venue, $city, $country) = explode('|', $row);
    $year = date('Y', strtotime($date));
    if(!isset($shows[$artist])) {
        $shows[$artist] = array('count' => 1, 'year' => $year);
    } else {
        $shows[$artist]['count']++;
        if($shows[$artist]['year'] < $year) {
            $shows[$artist]['year'] = $year;
        }
    }
}
echo '<h1>Bands and Shows</h1>';
ksort($shows);
foreach($shows as $band => $data) {
    echo 'I have seen <b>',$band,'</b> perform ',$data['count'],' times, most recently in ',$data['year'],'<br/>';
}
?>

我将两者结合使用,但这个答案包含了更多我最终使用的实际逻辑。谢谢