2013-03-29 3 views
0

Скажем, у меня есть каталог со следующими файлами, названный по дате (месяц, день и год).Анализ имен файлов и вывод отсортированного списка в HTML с использованием PHP

030313.pdf 030513.pdf 040113.pdf 052013.pdf

Я знаю, что можно разбить об именах файлов, используя взрываться() и я предполагаю, что я должен был бы сохранить данные как-то многомерный массив как это:

$files = array 
(
array("030313.pdf", 03,03,13), 
array("030513.pdf", 03,05,13), 
array("040113.pdf", 04,01,13), 
array("052013.pdf", 05,20,13) 
); 

можно ли тогда взять эту информацию, группу по месяцам, сортировать по дню, а затем эхо, что, как маркированный список ссылок?

Что-то вроде:

Март 2013:

  • 03/03/2013 (связанный с реальным файлом)
  • 03.05.2013 (связанный с реальным файлом)

апрель 2013 года:

  • 04/01/2013 (li nked в реальный файл)

Май 2013:

  • 05/20/2013 (связанный с реальным файлом)

Если это возможно, скажем, были 100-1000-х файлов , при загрузке этой страницы возникнут проблемы с производительностью сервера?

Благодаря

Brett

+1

Очевидно, что это возможно. Возможно, посмотрите на [DirectoryIterator] SPL (http://php.net/manual/en/class.directoryiterator.php). Что касается производительности, зависит от того, сколько запросов на это вы обрабатываете, если нужно, вы можете кэшировать данные в базу данных или что-то в отличие от файловой системы ... * Что вы пробовали? * – ficuscr

+0

Я не пробовал что-нибудь еще. Клиент попросил меня процитировать эту работу, используя существующую файловую систему CMS, и я знаком с работой с данными БД, а не с этим. Прежде чем я скажу им, что могу сделать это за бюджетные суммы, я хотел бы посмотреть, возможно ли это. К сожалению, использование db невозможно - это доступ к файлам CMS и db недопустим. – Brett

ответ

1

Здесь вы идете, только что обновил его заказать их (я пропустил это, когда я впервые прочитал ваш пост.)

<?php 

$files = array 
(
    array("030313.pdf", 03,03,13), 
    array("030513.pdf", 03,05,13), 
    array("040113.pdf", 04,01,13), 
    array("052013.pdf", 05,20,13) 
); 

$newArray = array(); 


foreach($files AS $file => $val){ 
     $newArray[$date = date('Ym', strtotime($val[1] . '/' . $val[2] . '/' . $val[3]))][] = $val[0]; 
} 

ksort($newArray); 

$list = '<ul>'; 
foreach($newArray AS $key => $val){ 

    $list .= '<li>' . date('F Y', strtotime('01-' . substr($key, 4, 2) . '-' . substr($key, 0, 4))); 

    if(is_array($val)){ 
     $list .= '<ul>'; 
     foreach($val AS $file => $filename){ 

      $list .= '<li><a href="' . $filename . '">Download ' . $filename . '</a></li>'; 

     } 
     $list .= '</ul>'; 
    } 
    $list .= '</li>'; 

} 

$list .= '</ul>'; 

echo $list; 

?> 
+0

Спасибо, Адриан. Я сделаю это. – Brett

+0

Извините, только что понял, что неправильно прочитал ваш исходный пост. – Adrian

+0

Адриан, просто запустил его со статическими данными и, похоже, отлично работает. http://brettatkin.com/projects/files/testing.php Спасибо! – Brett

1

Решение очень простое:

$files = array 
(
    array("030313.pdf", 03,03,13), 
    array("030513.pdf", 03,05,13), 
    array("040113.pdf", 04,01,13), 
    array("052013.pdf", 05,20,13) 
); 

$sortedData = array(); 

foreach ($files as $file) { 
    $dt = mktime(0, 0, 0, $file[1], 1, 2000); 
    $key = date('F', $dt) . ' ' . $file[3]; 
    if (array_key_exists($key, $sortedData)) { 
     $sortedData[$key] []= $file; 
    } else { 
     $sortedData[$key] = array($file); 
    } 
} 


function sortFunc($a, $b) { 
    if ($a[2] > $b[2]) { 
     return 1; 
    } else if ($a[2] < $b[2]) { 
     return -1; 
    } 
    return 0; 
} 

foreach ($sortedData as &$sd) { 
    usort($sd, sortFunc); 
} 


foreach ($sortedData as $key => $data) { 
    echo "<h1>".$key."</h1>\n"; 
    foreach ($data as $d) { 
     echo $d[0]."\n"; 
    } 
} 

Просто переформатировать выход.

Производительность зависит в основном от файловой системы, используемой на сервере. Реформирование массива из 1000 элементов обычно ничто.

+0

или просто используйте 'date ('F')' и отпустите массив $ months; – ficuscr

+0

@ficuscr, исправлено! –

+0

Спасибо, ты ответил на мой вопрос и дал мне возможное решение! – Brett

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

  • Нет связанных вопросов^_^