Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как сортировать дату?
 
 автор: Shorr Kan   (12.04.2005 в 16:19)   письмо автору
 
 

У меня есть файл. В нем построчно записаны события. Если взять этот файл в массив, и каждую строку делить explode'ом, то $info[0] - это дата.

Так вот, дата записывается в формате date("d F Y H:i:s")

Как можно сортировать это дело в порядке "наверху самое давнее событие, внизу - самое последнее" ?

Т.е., получается вот что:


$file=file(....);

$count=count($file);
for($i=0;$i<$count;$i++){
$info=explode("*",$file[$i]);

?><tr><td><?print "...";?></td></tr><?

}


Вот. Как?

   
 
 автор: cheops   (12.04.2005 в 21:50)   письмо автору
 
   для: Shorr Kan   (12.04.2005 в 16:19)
 

Это затруднительно... может вам записывать дату не в формате "d F Y H:i:s", а в виде числа секунд, прошедших с 1 января 1970 года - тогда будет всё проще, или формат файла критичен?

   
 
 автор: Shorr Kan   (12.04.2005 в 22:54)   письмо автору
 
   для: cheops   (12.04.2005 в 21:50)
 

Ну не то чтобы критичен... Но для глаз человека это должно быть читабельно. Это файл-history действий. Формат:

Дата_время*Событие*Изменение счета

   
 
 автор: cheops   (12.04.2005 в 23:11)   письмо автору
 
   для: Shorr Kan   (12.04.2005 в 22:54)
 

А нельзя записывать дату не в формате "d F Y H:i:s", а в "Y F d H:i:s" - тогда можно будет отсортировать по этому значению при помощи функций-сортировщиков массивов?

   
 
 автор: Shorr Kan   (13.04.2005 в 00:50)   письмо автору
 
   для: cheops   (12.04.2005 в 23:11)
 

Да думаю можно... А какими именно функциями? sort ?
И как это дело среагирует на месяц? April вроде как перед March будет следовать... Все же А первее M.

Ну вот сейчас у меня записывается в файл так:

date("Y F d H:i:s")."*"."Registration"."*0\r\n"


И? Как это дело сортировать (причем, как оказалось, нужно на выбор - и в порядке возрастания, и в порядке убывания... Слава богу, только по дате).

   
 
 автор: cheops   (13.04.2005 в 11:25)   письмо автору
 
   для: Shorr Kan   (13.04.2005 в 00:50)
 

А у нас же месяц... а нельзя его на двузначное число заменить? Т.е. использовать
<?php
  date
("Y h d H:i:s")."*"."Registration"."*0\r\n"
?>

Затем следует помесить дату в качестве ключа, а "*"."Registration"."*0\r\n" в качестве значения и отсортировать массив при помощи функции ksort (или krsort для обратного порядка).

   
 
 автор: Shorr Kan   (13.04.2005 в 14:31)   письмо автору
 
   для: cheops   (13.04.2005 в 11:25)
 

Не очень понятно, почему я раньше не догадался... Теперь я пишу просто четыре, а не три столбика. Второй столбик - дата для человека, в первый - для сортировки. Как по ней сортировать? МОжно ли как-то избежать foreach, и воспользоваться for'ом, но используя ключи?

Сейчас я перед for'ом делаю krsort($file); (и иже с ними - ksort,sort...) - но результат нулевой... Никакой сортировки.

Вот местечко, где нужно прикрепить сортировку.


$itog=0;
for($i=0;$i<$count;$i++){
$info=explode("*",$file[$i]);
$itog=$itog+$info[3];
...


Пример из файла с историей:


2005 04 09 14:22:47*09 April 2005 14:22:47*Percent*+0.89

   
 
 автор: cheops   (13.04.2005 в 21:51)   письмо автору
 
   для: Shorr Kan   (13.04.2005 в 14:31)
 

Т.е. первая дата у нас в info[0]? Тогда следует сначала отсортировать массив
<?php
$arr 
= array();
for(
$i=0;$i<$count;$i++)

  
$info=explode("*",$file[$i]); 
  
$arr[$info[3]] = info[1]."*".info[2]."*".info[3];
}
// Сортируем
ksort($arr);
?>

а затем выполнять полезную работу...
<?php
$itog
=0
for(
$i=0;$i<$count;$i++){ 
$info=explode("*",$arr[$i]); 
$itog=$itog+$info[2]; 
...
?>

   
 
 автор: Shorr Kan   (14.04.2005 в 00:39)   письмо автору
 
   для: cheops   (13.04.2005 в 21:51)
 

Я, конечно, еще не успел попробовать... но вот так вот смотрю.... не понимаю кода. Попробую - модет в процессе использования что и пойму... Но если у вас будет время - попробуйте объяснить первый for... Что-то он не коннектится с моим междоушием...

======
Попробовал... Ошибки :(

Во-первых, он не считает повторяющиеся строки. Т.е., у меня 15 строк, но уникальных по этой дате в $info[0] - только девять. Он на print count($arr) девять и печатает. Во-вторых... Просто ошибки выводит.

Notice: Undefined offset: 0
это на строку, где $info=explode("*",$arr[$i]);

   
 
 автор: Shorr Kan   (14.04.2005 в 08:31)   письмо автору
 
   для: Shorr Kan   (14.04.2005 в 00:39)
 

А что если писать для сортировки date("U"); ?

"U
Количество секунд, прошедших с начала Эпохи Unix (The Unix Epoch, 1 января 1970, 00:00:00 GMT)
"

   
 
 автор: cheops   (14.04.2005 в 11:17)   письмо автору
 
   для: Shorr Kan   (14.04.2005 в 08:31)
 

Ну это было бы идеально, я про это и намёкивал во вотором посту :))) - это удобнее, так как число будет одно, а не несколько, следовательно и сортировка будет происходить очень быстро.

   
 
 автор: cheops   (14.04.2005 в 11:26)   письмо автору
 
   для: Shorr Kan   (14.04.2005 в 00:39)
 

Смысл такой что мы разрезаем строку
2005 04 09 14:22:47*09 April 2005 14:22:47*Percent*+0.89

по символу * - получается массив $info c 4 элменетами, мы создаём массив $arr, ключём которого выступает первый элмент (время, по которому мы сортируем), а значение оставшаяся часть строки. Так как она распилена по символу * мы её опять склеиваем. Потом сортируем массив и режем уже строку
09 April 2005 14:22:47*Percent*+0.89

А да, во вотором цикле массив $info лучше уже не использовать, так как он замусорен первым циклом, или обнулить его при помощи unset
<?php
  
unset($info);
?>

перед повторным использованием.

   
 
 автор: Shorr Kan   (14.04.2005 в 11:59)   письмо автору
 
   для: cheops   (14.04.2005 в 11:26)
 

Он мне на arr[$i] ругается... и правильно - если я принтую arr[0] - это неизвестная штука для него... формат строки сейчас такой:

1112685502*05 April 2005 11:18:22*Percent*+0.00

Первое - это unix_timestamp...


$count=count($file);
for($i=0;$i<$count;$i++) 

  $info=explode("*",$file[$i]); 
  $arr[$info[0]]=$info[1]."*".$info[2]."*".$info[3]; 

...
...
...

ksort($arr);unset($info);
for($i=0;$i<$count;$i++){
$info=explode("*",$arr[$i]);
$itog=$itog+$info[3];


Ошибки, ошибки, ошибки... он не понимает $arr[0], $arr[1], и т.д.

   
 
 автор: cheops   (14.04.2005 в 12:13)   письмо автору
 
   для: Shorr Kan   (14.04.2005 в 11:59)
 

А ну да, конечно же, боюсь без foreach во втором цикле не обойтись
<?php 
$itog
=0
foreach(
$arr as $value){ 
$info=explode("*",$value); 
$itog=$itog+$info[2]; 
... 
?>

   
 
 автор: Shorr Kan   (14.04.2005 в 18:56)   письмо автору
 
   для: cheops   (14.04.2005 в 12:13)
 

Так... Ошибок нет - и вроде даже сортирует... Но убивает дублирующиеся значения... Это можно как-то исправить? А то только половина истории вывелась.

   
 
 автор: cheops   (14.04.2005 в 22:57)   письмо автору
 
   для: Shorr Kan   (14.04.2005 в 18:56)
 

А дублируется что? Есть функция array_unique, которая удаляет из массива дублирующие значения и оставляет только уникальные.

   
 
 автор: Shorr Kan   (14.04.2005 в 23:05)   письмо автору
 
   для: cheops   (14.04.2005 в 22:57)
 

Наоборот! У меня юникстаймстамп в некоторых местах - одинаков... и вот из-за этой ksort и krsort - происходит выводт пользователю только уникальных значений... а мне нужно - всех.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования