1

我有一个这样的降价文件数组:

$mdfiles = glob("content/*.txt", GLOB_NOSORT);

我想按每个文件中的某一行对文件进行排序。

一个示例文件是:

File
====
line-one:
date: [number-to-sort]

然后在每个文件中按 [number-to-sort] 对文件数组进行排序,可以通过以下方式访问:

$file_array = file($mdfiles[*], FILE_IGNORE_NEW_LINES)
substr($file_array[*], 6);

最后,我想从数组键值中删除每个content/和。.md

4

2 回答 2

1

代码在我看来要小得多,但生成的代码只有三行 :)

$files = glob('content/*.txt', GLOB_NOSORT);
// sort the file array by date; see below
usort($files, 'by_file_date');
// strip the filename
$files = array_map('strip_filename', $files);

'by_file_date'函数稍后声明,基本上在get_date内部使用该函数从文件中“拉取”日期。我preg_match根据您显示的表格使用了查找日期值;我假设这date是一个整数(即数字序列)。如果没有,请告诉我。

// pull date value from the file
// @todo this function can be optimized by keeping a static array of
//   files that have already been processed
function get_date($f)
{
    // match the date portion; i'm assuming it's an integer number
    if (preg_match('/^date:\s*(\d+)/', file_get_contents($f), $matches)) {
        return (int)$matches[1];
    }
    return 0;
}

function by_file_date($a, $b)
{
    // sort by date ASC
    return get_date($a) - get_date($b);
}

最后,您需要剥离文件名;假设您只想要文件名而不是目录:

function strip_filename($f)
{
    // strip the directory portion
    return basename($f);
}

不知道从哪里来.md,所以你必须让我知道那个:)

于 2012-06-08T10:31:56.823 回答
-1

尝试类似的东西

foreach( $mdfiles as $file ) {
    $file_array = file($file, FILE_IGNORE_NEW_LINES);
    $order = substr( $file_array[0], 6 ); // get 6th character till the end of the first line
    $files[$order] = basename( $file, '.md' );
}
ksort($files); // might need this depending on how youre using the array

你有大部分。只需要将文件放在一个新数组中,然后将目录和分机命名为基本名称

于 2012-06-08T10:09:36.063 回答