|
|
|
| У меня есть файл. В нем построчно записаны события. Если взять этот файл в массив, и каждую строку делить 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><?
}
|
Вот. Как? | |
|
|
|
|
|
|
|
для: Shorr Kan
(12.04.2005 в 16:19)
| | Это затруднительно... может вам записывать дату не в формате "d F Y H:i:s", а в виде числа секунд, прошедших с 1 января 1970 года - тогда будет всё проще, или формат файла критичен? | |
|
|
|
|
|
|
|
для: cheops
(12.04.2005 в 21:50)
| | Ну не то чтобы критичен... Но для глаз человека это должно быть читабельно. Это файл-history действий. Формат:
Дата_время*Событие*Изменение счета | |
|
|
|
|
|
|
|
для: Shorr Kan
(12.04.2005 в 22:54)
| | А нельзя записывать дату не в формате "d F Y H:i:s", а в "Y F d H:i:s" - тогда можно будет отсортировать по этому значению при помощи функций-сортировщиков массивов? | |
|
|
|
|
|
|
|
для: cheops
(12.04.2005 в 23:11)
| | Да думаю можно... А какими именно функциями? sort ?
И как это дело среагирует на месяц? April вроде как перед March будет следовать... Все же А первее M.
Ну вот сейчас у меня записывается в файл так:
date("Y F d H:i:s")."*"."Registration"."*0\r\n"
|
И? Как это дело сортировать (причем, как оказалось, нужно на выбор - и в порядке возрастания, и в порядке убывания... Слава богу, только по дате). | |
|
|
|
|
|
|
|
для: 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 для обратного порядка). | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: 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];
...
?>
|
| |
|
|
|
|
|
|
|
для: 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 в 00:39)
| | А что если писать для сортировки date("U"); ?
"U
Количество секунд, прошедших с начала Эпохи Unix (The Unix Epoch, 1 января 1970, 00:00:00 GMT)
" | |
|
|
|
|
|
|
|
для: Shorr Kan
(14.04.2005 в 08:31)
| | Ну это было бы идеально, я про это и намёкивал во вотором посту :))) - это удобнее, так как число будет одно, а не несколько, следовательно и сортировка будет происходить очень быстро. | |
|
|
|
|
|
|
|
для: 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
перед повторным использованием. | |
|
|
|
|
|
|
|
для: 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], и т.д. | |
|
|
|
|
|
|
|
для: Shorr Kan
(14.04.2005 в 11:59)
| | А ну да, конечно же, боюсь без foreach во втором цикле не обойтись
<?php
$itog=0;
foreach($arr as $value){
$info=explode("*",$value);
$itog=$itog+$info[2];
...
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(14.04.2005 в 12:13)
| | Так... Ошибок нет - и вроде даже сортирует... Но убивает дублирующиеся значения... Это можно как-то исправить? А то только половина истории вывелась. | |
|
|
|
|
|
|
|
для: Shorr Kan
(14.04.2005 в 18:56)
| | А дублируется что? Есть функция array_unique, которая удаляет из массива дублирующие значения и оставляет только уникальные. | |
|
|
|
|
|
|
|
для: cheops
(14.04.2005 в 22:57)
| | Наоборот! У меня юникстаймстамп в некоторых местах - одинаков... и вот из-за этой ksort и krsort - происходит выводт пользователю только уникальных значений... а мне нужно - всех. | |
|
|
|