2012-06-08 2 views
1

у меня есть массив уценки файлов, как это:Сортировка файлов в массив по линии содержания

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

Я хочу, чтобы отсортировать файлы по определенной линии внутри каждого из них.

Пример файла:

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

Массив файлов сортируется с помощью [номер-к-то] в каждом файле, которые могут быть доступны с помощью:

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

Наконец я хотели бы удалить каждый из content/ и .md из значений ключа массива.

+0

Где '.md' взялось? –

ответ

2

Этого кода выглядел намного меньше, на моем взгляде, но полученный код всего три строки :)

$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 пришел, так что вы должны дать мне знать о том, что один :)

-1

Try что-то вроде

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 

Вы имели большую часть. Просто необходимо, чтобы поместить файл в новом массиве и BASENAME в реж и внеш от

+0

Я не думаю, что '$ mdfiles [*]' или '$ file_array [*]' является допустимым синтаксисом. –

+0

Это не так, я забыл отредактировать эту часть. Благодарю. – Galen

+0

Это не сработает, если два значения даты одинаковы :) –

Смежные вопросы