php按键过滤数组

php按键过滤数组,php,arrays,Php,Arrays,我有一个类似以下格式的csv文件。有 实际文件中没有列标题-为清晰起见,此处显示了列标题 id|user|date|description 0123456789|115|2011-10-12:14:29|bar rafael 0123456789|110|2012-01-10:01:34|bar rafael 0123456902|120|2011-01-10:14:55|foo fighter 0123456902|152|2012-01-05:07:17|foo fighter 012345

我有一个类似以下格式的csv文件。有 实际文件中没有列标题-为清晰起见,此处显示了列标题

id|user|date|description
0123456789|115|2011-10-12:14:29|bar rafael
0123456789|110|2012-01-10:01:34|bar rafael
0123456902|120|2011-01-10:14:55|foo fighter
0123456902|152|2012-01-05:07:17|foo fighter
0123456902|131|2011-11-21:19:48|foo fighter
对于每个ID,我只需要保留最新的记录,然后写入 将结果返回到文件

结果应该是:

0123456789|110|2012-01-10:01:34|bar rafael
0123456902|152|2012-01-05:07:17|foo fighter
我已经看过数组函数,没有看到任何 将在没有某种嵌套循环的情况下执行此操作

有更好的办法吗

const F_ID = 0;
const F_USER = 1;
const F_DATE = 2;
const F_DESCRIPTION = 3;

$array = array();

if (($handle = fopen('test.csv', 'r')) !== FALSE) {
  while (($data = fgetcsv($handle, 1000, '|')) !== FALSE) {

    if (count($data) != 4)
      continue; //skip lines that have a different number of cells

    if (!array_key_exists($data[F_ID], $array)
      || strtotime($data[F_DATE]) > strtotime($array[$data[F_ID]][F_DATE]))
      $array[$data[F_ID]] = $data;
  }
}
您将在
$array
中获得所需的内容。你可以用

注意。我没有测试这段代码,它的目的是提供一个如何工作的基本概念


其思想是使用第一个值(ID)作为键,将您想要的行存储到
$array
。这样,在您读取的每一行上,您都可以检查是否已经有一个具有该ID的记录,并且只有在日期较新时才替换它。

每次遇到新ID时,将其放入
$out
数组中。如果该id已存在,请在该值较新时覆盖它。比如:

$in_array = file('myfile.txt');
$out_array = array();
$fields = array('id', 'user', 'date', 'description');

foreach($in_array as $line) {
    $row = array_combine($fields, explode('|', $line) );
    //New id? Just add it.
    if ( !isset($out_array[ $row['id'] ]) ) {
        $out_array[ $row['id'] ] = $row;
    }
    //Existing id? Overwrite if newer.
    else if (strcmp( $row['date'], $out_array[ $row['id'] ]['date'] ) > 0 ) {
        $out_array[ $row['id'] ] = $row;
    }
    //Otherwise ignore
}

//$out_array now has the newest row for each id, keyed by id.

数据实际上是由管道(
|
)分隔的吗?还是逗号?正如CSV所暗示的。。。