Ввод файлов с учётом их даты и времени
Есть каталог, в нём файлы с расширением html. Надо вывести n последних по дате и времени создания файлов, или все файлы, если их общее количество меньше n, причём, чем старше файл, тем он должен быть ниже на странице. В принципе, цикл перебора файлов каталога у меня есть. А как отсортировать их по дате и времени создания? Или как хотя бы получить дату и время создания файла и запихать имя дату и время создания файла в массив?
Определение даты с учетом времени
наткнулся на похожую тему https://www.cyberforum.ru/php-beginners/thread1250123.html Но там.
Среднее время созданых файлов в папке, с учетом даты создания bat
Привет! Нужно посчитать среднее время созданых файлов в папке, с учетом даты создания. В папке.
Диалоговый ввод даты и времени
Подскажите как сделать диалог ввода даты, и диалог ввода времени. Оптимально чтоб диалог был.
Автоматический ввод даты и времени в поле Дата
Добрый день! Помоги разобраться с вопросом ввода даты и времени в поле. Пробовал самый простой.
filemtime() — получить дату последнего изменения файла. Именно дату создания я не нашёл.
Создай массив, где в качестве ключей будет результат этой функции (метка времени изменения файла). После этого массив можно просто отсортировать по ключам в обратном порядке:
foreach($files as $date => $fname) { echo "Файл $fname с датой изменения ".date('Y-m-d H:i:s',$date)."
\r\n"; }
Humanoid, у меня получилось так, это работает, но мне не нравится стиль массива, вот это $a[$file] = filemtime($file); мб есть более правильный вариант записи?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
$dir = opendir ("."); $a =array(); while ($file = readdir ($dir)) { $a[$file] = filemtime($file); } echo ""
; echo print_r($a); echo "
"; asort($a); echo "
"; echo print_r($a); echo "
"; ?>
[content.txt] => 1309333294[getconet.php] => 1309334719
[cont.php] => 1309334844
borovik, лично мне кажется, что красивее было бы в качестве ключа использовать время, а в качестве элемента массива — имя файла. и сортировать по ключам:
while ($file = readdir ($dir)) { $a[filemtime($file)] = $file; } ksort($a);
Сообщение от Humanoid
Я забыл указать, что файлы повторно не редактировались.
Добавлено через 2 минуты
Сообщение от Humanoid
foreach($files as $date => $fname)
* echo «Файл $fname с датой изменения «.date(‘Y-m-d H:i:s’,$date).»
\r\n»;
>
Мне кажется, что так буду выведены все новые, модифицированные с определённого момента. А надо вывести заданное число самых новых. И вывеси надо не имена, а сами файлы. Может вам всем будет проще понять задачу, если назвать её формированием новостного фрейма? Есть страница, на ней таблица в таблице ячейка, в ячейке iframe, во фрейме news.php, которая должна выдать 20 последних новостей, самую свежую запихать в верх, остальные в порядке убывания свежести.
Сообщение от taras atavin
Тогда дата редактирования будет точно такая же, как и дата создания.
Сообщение от taras atavin
$nom=0; foreach($files as $date => $fname) { echo "Файл $fname с датой изменения ".date('Y-m-d H:i:s',$date)."
\r\n"; $nom++; if ($nom>=10) break; // показать только первые 10 файлов }
$files = array_slice($files,0,10); // оставить только первые 10 элементов foreach($files as $date => $fname) { echo "Файл $fname с датой изменения ".date('Y-m-d H:i:s',$date)."
\r\n"; }
Сообщение от taras atavin
Есть страница, на ней таблица в таблице ячейка, в ячейке iframe, во фрейме news.php, которая должна выдать 20 последних новостей, самую свежую запихать в верх, остальные в порядке убывания свежести.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
$handle = opendir("news"); $last = readdir($handle) $first = $last; $handle = opendir("news"); while ($i = readdir($handle)) { if (filemtime($i)>filemtime($last)) { $last=$i; } if (filemtime($i)filemtime($first)) { $first=$i; } } /*В $last последний файл*/ for ($i=1; i20; ++i) { $last1=$first; $handle = opendir("news"); while ($j = readdir($handle)) { if ((filemtime($j)>filemtime($last1))&(filemtime($j)filemtime($last))) { $last1=$j; } } if (filemtime($last)==filemtime($last1)) { break; } $last=$last1; /*В last предыдущий файл*/ } ?>
правильно? Как теперь на месте комментариев вывести не имена, а сами файлы?
Добавлено через 46 минут
Сообщение от Humanoid
Предпложи скрипт, который бы копировал файлы контент htmlфайлов в БД. Кстати, куда к MySQL вообще коннектиться и как на wampе поставить пароль MySQL?
Добавлено через 2 минуты
Сообщение от Humanoid
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
$_SERVER['PHP_SELF']?>" method="POST"> Папка
Количество файлов
По возрастанию
По убыванию
if(isset($_POST['check'])) { if($_POST['dir'] !== '0' && empty($_POST['dir'])) { echo 'Не указана папка!
'; $test = 'boom!'; } if($_POST['nf'] !== '0' && empty($_POST['nf'])) { echo 'Не задано количество файлов!
'; $test = 'boom!'; } if(!isset($_POST['sort'])) { echo 'Не выбран способ сортировки!'; $test = 'boom!'; } if(isset($test)) exit(); $nf = trim($_POST['nf']); $sort = $_POST['sort']; $dir = trim($_POST['dir']); if(!preg_match("#(?:\|\\|\\\|\\\\|/|//|///|////)$#isU", $dir)) $dir .= '\\'; $scandir = scandir($dir); foreach($scandir as $v) if(preg_match("#\.html$#isU",$v)) { $a[] = 'file:///'.$dir.$v; $aname[] = $v; } for($i=0;$icount($a);$i++){ $b[date('Y:m:d H:i:s', filemtime($a[$i]))] = $a[$i]; $bname[date('Y:m:d H:i:s', filemtime($a[$i]))] = $aname[$i]; } if($sort == 'up') { ksort($b); ksort($bname); } if($sort == 'down') { krsort($b); krsort($bname); } foreach($b as $k=>$v) { $names[] = $v; $k = preg_replace("#^(.+):(.+):(.+)\s(.+)$#isU", "$3:$2:$1 $4", $k); $filemtime[] = $k; } foreach($bname as $v) { $bnames[] = $v; } echo ''; } ?>
Имя файла Дата и время создания '; if($sort == 'up') echo ''; if($sort == 'down') echo ' Сортировка по возрастанию
'; if($nf > count($b)) $number = count($b); else $number = $nf; for($i=0;$i$number;$i++){ echo ' Сортировка по убыванию
'; } echo ' .$names[$i].'" target="_blank">'.$bnames[$i].' '.$filemtime[$i].'
В этом коде я потерялся. Нельзя ли отдельно 20 штук от последнего к раннему и без формы? Если потом понадобится форму всё же прикрутить то к понятому скрипту это будет проще, чем пытаться одновременно вычленить нужное и разобраться со всеми задачами разом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
$_SERVER['PHP_SELF']?>" method="POST"> Папка
Количество файлов
По убыванию
По возрастанию
if(isset($_POST['check'])) { if($_POST['dir'] !== '0' && empty($_POST['dir'])) { echo 'Не указана папка!
'; $test = 'boom!'; } if($_POST['nf'] !== '0' && empty($_POST['nf'])) { echo 'Не задано количество файлов!
'; $test = 'boom!'; } if(!isset($_POST['sort'])) { echo 'Не выбран способ сортировки!'; $test = 'boom!'; } if(isset($test)) exit(); $nf = trim($_POST['nf']); $sort = $_POST['sort']; $dir = trim($_POST['dir']); if(!preg_match("#(?:\|\\|\\\|\\\\|/|//|///|////)$#isU", $dir)) $dir .= '\\'; $scandir = scandir($dir); foreach($scandir as $v) if(preg_match("#\.html$#isU",$v)) { $a[] = 'file:///'.$dir.$v; $aname[] = $v; } for($i=0;$icount($a);$i++){ $b[filemtime($a[$i])] = $a[$i]; $bname[filemtime($a[$i])] = $aname[$i]; //$b[date('Y:m:d H:i:s', filemtime($a[$i]))] = $a[$i]; //$bname[date('Y:m:d H:i:s', filemtime($a[$i]))] = $aname[$i]; } if($sort == 'up') { ksort($b); ksort($bname); } if($sort == 'down') { krsort($b); krsort($bname); } foreach($b as $k=>$v) { $names[] = $v; $filemtime[] = date('d:m:Y H:i:s', $k); } foreach($bname as $v) { $bnames[] = $v; } echo ''; } ?>
Имя файла Дата и время последнего изменения '; if($sort == 'up') echo ''; if($sort == 'down') echo ' Сортировка по возрастанию
'; if($nf > count($b)) $number = count($b); else $number = $nf; for($i=0;$i$number;$i++){ echo ' Сортировка по убыванию
'; } echo ' .$names[$i].'" target="_blank">'.$bnames[$i].' '.$filemtime[$i].'
Добавлено через 1 минуту
а ты создай пхп файл с этим кодом, посмотри как работает и поймешь все. Humanoid выше же написал принцип сортировки, что именно тебе не понятно то)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
$handle = opendir("news"); // Открываю каталог $last = readdir($handle); // В этой переменной хочу найти последний файл $first = $last; // А в этой - первый $handle = opendir("news"); // Открываю заново while ($i = readdir($handle)) // Перебираю все файлы, в i будет текущий файл {// Начало тела цикла if (filemtime($i)>filemtime($last))//i позже last? {//i позже last $last=$i;//Значит найден новый last }//i позже last if (filemtime($i)filemtime($first))//i раньше first ? {//i раньше first $first=$i;//Значит найден новый first }//i раньше first }// Конец тела цикла /*В $last последний файл*/ /*Здесь же будет файл, выданный последним*/ for ($i=1; i20; ++i)// Внешний цикл, перебираю позиции в выдаче {// Начало тела внешнего цикла $last1=$first;// В этой переменной хочу найти файл для текущей позиции, он предыдущий перед файлом, выданным последним, то есть последний среди не выданных $handle = opendir("news");// Снова открываю каталог while ($j = readdir($handle))// Внутренний цикл, перебираю файлы {//Начало тела внутреннего цикла if ((filemtime($j)>filemtime($last1))&(filemtime($j)filemtime($last)))// текущий файл позже last1, но раньше last? {// текущий файл позже last1, но раньше last $last1=$j;// Значит найден более правильный }// текущий файл позже last1, но раньше last }//Конец тела внутреннего цикла /*В last1 предыдущий файл*/ $last=$last1;// Так как только что выведен файл last1, то он if (filemtime($last1)==filemtime($first))// Это первый файл? {// Это первый файл break;// Значит выданы все, выходим из внешнего цикла }// Это первый файл }//Конец тела внешнего цикла ?>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
$nf = '20'; // количество файлов $sort = 'down'; // способ сортировки: up - по возрастанию, down - по убыванию $dir = 'папка с .html'; //if(!preg_match("#(?:\|\\|\\\|\\\\|/|//|///|////)$#isU", $dir)) $dir .= '\\'; $scandir = scandir($dir); foreach($scandir as $v) if(preg_match("#\.html$#isU",$v)) { $a[] = $dir.$v; $aname[] = $v; } for($i=0;$icount($a);$i++){ $b[filemtime($a[$i])] = $a[$i]; $bname[filemtime($a[$i])] = $aname[$i]; } if($sort == 'up') { ksort($b); ksort($bname); } if($sort == 'down') { krsort($b); krsort($bname); } foreach($b as $k=>$v) { $names[] = $v; $filemtime[] = date('d:m:Y H:i:s', $k); } foreach($bname as $v) { $bnames[] = $v; } if($nf > count($b)) $number = count($b); else $number = $nf; for($i=0;$i$number;$i++){ echo ''.$bnames[$i].' '.$filemtime[$i]; $content = file_get_contents($names[$i]); echo '
'.$content.'
'; } ?>
Так я и не понял. Сортируется массив времени? А как не потерять его связь с файлом?
Добавлено через 1 минуту
$last=$last1;// Так как только что выведен файл last1, то он теперь выведен последним
PHP: Create directory based on current date.
This is a PHP tutorial on how to create directories and sub-directories that are based on the current date. These kind of “YYYY/MM/DD” folder structures are pretty common, especially in web apps that allow users to upload files.
An explanation of the PHP code above:
- We get the current year using PHP’s date function.
- We get the current month.
- We get the current day.
- We combine our date variables into a directory structure.
- We create the directory if it doesn’t already exist.
Today’s date is the 26th of November, 2015. When I run the code above, it creates the directory structure “2015/11/26”.
If you’re dealing with a large number of incoming files, you may want to add the current hour as a sub-directory as well:
I ran the above code and the following directory structure was created:
Note that 16 is 4PM in 24-hour format. If a user uploads a file at 10.25AM on Christmas Day, then the structure will look like so:
Why place files into different sub-directories?
When a folder contains too many files, it can cause performance issues. For instance, on Windows, the Explorer program can freeze up as it attempts to display meta data for each file. Web-based file browsers can also run into issues when there are too many files in the same folder. It is also handy in the sense that if you need to manually search for a specific file, knowing the date that it was uploaded on will narrow down your search.