解析文本文件

时间:2011-04-09 11:04:33

标签: php arrays sorting

我需要一个建议。

我需要废弃并解析文本文件(使用货币汇率)。我们在这里,是这个文件的一个小片段:

c057z110323
h057z110323
a057z110323
b012z110323
c058z110324
h058z110324
a058z110324
c059z110325
h059z110325
a059z110325
c060z110328
h060z110328
a060z110328
c061z110329
h061z110329
a061z110329
c062z110330
h062z110330
a062z110330
b013z110330
c063z110331
h063z110331
a063z110331
c064z110401
h064z110401
a064z110401
c065z110404
h065z110404
a065z110404
c066z110405
h066z110405
a066z110405
c067z110406
h067z110406
a067z110406
b014z110406
c068z110407
h068z110407
a068z110407
c069z110408
h069z110408
a069z110408

你可能会看到有很多行(在原始文件中有大约80000行(每天添加几行)。

字符串格式如下:

A000112233  
where  
A - type  
000 - number of the file (created this year)  
11 - year  
22 - month  
33 - day 

我使用以下代码段从文件中获取25条最新行:

    $file = "http://www.nbp.pl/kursy/xml/dir.txt";
    $data = file($file);
    $count = count($data);

    for($i = $count - 25; $i < $count; $i++)
    {
        if( substr($data[$i], 0, 1) === 'a' )
        {
            $latest[] = $data[$i];
        }
    }

我只需要以“a”开头的行。输出数组如下所示:

array(8) {
  [0]=>
  string(13) "a062z110330
"
  [1]=>
  string(13) "a063z110331
"
  [2]=>
  string(13) "a064z110401
"
  [3]=>
  string(13) "a065z110404
"
  [4]=>
  string(13) "a066z110405
"
  [5]=>
  string(13) "a067z110406
"
  [6]=>
  string(13) "a068z110407
"
  [7]=>
  string(13) "a069z110408
"
}

现在我需要比较每个数组元素,以获取当前日期之前最近一个工作日的最新项目。我正是这样做的:

        $i = 1;
        foreach($latest as $row)
        {
            $plural = ($i > 1) ? 's' : null;

            if( substr(trim($row), -6) === date("ymd", strtotime("-" . $i . " day" . $plural) )
            {
                $filename = $row;
                break;
            }

            $i++;
        }

它工作得很好,但是我面临一个大问题。我无法按最新的六个字符对$latest数组进行排序。我尝试使用sort(),rsort()来做这件事。这些都不适合我。

任何人都可以帮我解决这个问题,或者可能有更好的方法去做我正在寻找的事情。

3 个答案:

答案 0 :(得分:1)

您需要使用自定义排序方法。您可以使用usort编写自己的比较函数:http://php.net/manual/en/function.usort.php

来自手册

function cmp($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

$a = array(3, 2, 5, 6, 1);

usort($a, "cmp");
  

比较功能必须返回一个   小于,等于或的整数   如果第一个大于零   论证被认为是   分别小于,等于或   大于第二个。

答案 1 :(得分:1)

当你这样做时

for($i = $count - 25; $i < $count; $i++)
{
    if( substr($data[$i], 0, 1) === 'a' )
    {
        $latest[] = $data[$i];
    }
}

将日期用作$latest数组中的键:

for($i = $count - 25; $i < $count; $i++)
{
    if( substr($data[$i], 0, 1) === 'a' )
    {
        $key = (int) substr($data[$i], -6);
        $latest[$key] = $data[$i];
    }
}

然后您可以按key排序:

ksort($latest);

答案 2 :(得分:1)

因为您只询问如何按最后六个字符对字符串数组进行排序:

使用usort

function sortfunc($a, $b) {
  return strcmp(substr($a, -6), substr($b, -6));
}

usort($latest, 'sortfunc');

您可能需要先修剪()行,否则换行符和/或回车符将成为最后6个字符的一部分。