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

コードは私の頭ではずっと小さく見えましたが、結果のコードはわずか 3 行です :)

$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 に答える