[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сортировка в текстовом файле.
Karev
Спасайте бестолкового от закипания мозга....

Имеем:
Текстовый файл со строками:
номер новости | дата | url | автор | заголовок
номер новости | дата | url | автор | заголовок
...
номер новости | дата | url | автор | заголовок
Предположительный размер файла - не более 1000 строк.

Задача:
при изменении номера одной (нескольких) из новостей, пересортировать строки по полю "номер новости" и перезаписать текстовый файл

Началось всё хорошо ))

case 'sortnews':
{
//функция сортировки
function priceCmp ( $a, $b ){
if ( $a[price] == $b[price] ) return 0;
if ( $a[price] < $b[price] ) return -1; return 1;}

// читаем файл
$file = file ("news.dat");

// считаем строки
$lines = count ($file);

// создаём массив
for ($i=0; $i<$lines; $i++)
{
list ($numbernews,$datenews,$urlnews,$authornews,$titlenews) = explode ("|",$file[$i]);
$array[$i] = array (price => $numbernews, name => array ($numbernews,$datenews,$urlnews,$authornews,$titlenews));
}
// сортируем массив
usort ( $array, priceCmp );

// проверяем
print_r ($array);
// ура, работает....

// дальше - провал в мозгах из-за необразованности:
// Как преобразовать полученный массив обратно к виду
// $numbernews | $datenews | $urlnews | $authornews | $titlenews
// $numbernews | $datenews | $urlnews | $authornews | $titlenews
// ...
// $numbernews | $datenews | $urlnews | $authornews | $titlenews
// ????



// после этого опять все хорошо ))
// записываем новый текстовый файл вместо старого
$bd = fopen ("news.dat",'w') or die("не могу открыть файл");
flock($bd,2);
fwrite($bd, $newcontent);
flock($bd,3);
fclose ($bd);
break;
}

И вообще может что не так делаю (не оптимально) или ляпов насажал?
Заранее благодарен за помощь.



Спустя 4 минуты, 38 секунд (19.10.2010 - 09:21) Michael написал(а):
Цитата
И вообще может что не так делаю (не оптимально) или ляпов насажал?

базы данных принципиально не используете или нет возможности?

Спустя 5 минут, 4 секунды (19.10.2010 - 09:26) sergeiss написал(а):
Цитата (Karev @ 19.10.2010 - 10:16)
И вообще может что не так делаю...

Забудь всё, что ты тут написал и переделай с использованием БД smile.gif Это будет наиболее оптимально.
И в твоём случае, возможно, SQLite больше всего подойдет.

PS. Михаэль уже написал то же самое... Но я всё равно оставлю своё сообщение.

Спустя 20 минут, 7 секунд (19.10.2010 - 09:46) Karev написал(а):
Цитата (Michael @ 19.10.2010 - 06:21)
Цитата
И вообще может что не так делаю (не оптимально) или ляпов насажал?

базы данных принципиально не используете или нет возможности?

Нет возможности, к сожалению. Иначе бы не заморачивался - на БД есть куча готовых решений, дешевых и сердитых.

Спустя 8 минут, 50 секунд (19.10.2010 - 09:55) sergeiss написал(а):
Цитата (Karev @ 19.10.2010 - 10:46)
Нет возможности, к сожалению.

Даже SQLite?

Если действительно нет возможности, то....
Цитата (Karev @ 19.10.2010 - 10:16)
// дальше - провал в мозгах из-за необразованности:
// Как преобразоватьполученный массив обратно к виду
// $numbernews | $datenews | $urlnews | $authornews | $titlenews
// $numbernews | $datenews | $urlnews | $authornews | $titlenews
// ...
// $numbernews | $datenews | $urlnews | $authornews | $titlenews
// ????

Просто "тупо" суммировать строки.
$s1='oidjfsldj';
$s2='opisuoijs';
// сумма строк с разделителем между ними
$s = $s1 . '|' . $s2;

Спустя 8 минут, 13 секунд (19.10.2010 - 10:03) Karev написал(а):
Цитата (sergeiss @ 19.10.2010 - 10:55)
Цитата (Karev @ 19.10.2010 - 10:46)
Нет возможности, к сожалению.

Даже SQLite?

Если действительно нет возможности, то....
Цитата (Karev @ 19.10.2010 - 10:16)
// дальше - провал в мозгах из-за необразованности:
// Как преобразоватьполученный массив обратно к виду
// $numbernews | $datenews | $urlnews | $authornews | $titlenews
// $numbernews | $datenews | $urlnews | $authornews | $titlenews
// ...
// $numbernews | $datenews | $urlnews | $authornews | $titlenews
// ????

Просто "тупо" суммировать строки.
$s1='oidjfsldj';
$s2='opisuoijs';
// сумма строк с разделителем между ними
$s = $s1 . '|' . $s2;

Даже SQLite, т.к. дописывается модуль под уже существующую, рабочую систему.. Заказчик ничего менять не хочет.

А как массив в строки-то загнать??

Спустя 3 минуты, 8 секунд (19.10.2010 - 10:06) sergeiss написал(а):
Цитата (Karev @ 19.10.2010 - 11:03)
А как массив в строки-то загнать??

А это я кому написал, как ты думаешь? blink.gif
Цитата (sergeiss @ 19.10.2010 - 10:55)
$s1='oidjfsldj';
$s2='opisuoijs';
// сумма строк с разделителем между ними
$s = $s1 . '|' . $s2;

Или ты не можешь указать несколько элементов массива вместо простых переменных????????

Спустя 9 часов, 39 минут, 55 секунд (19.10.2010 - 19:46) Karev написал(а):
Цитата (sergeiss @ 19.10.2010 - 11:06)
Или ты не можешь указать несколько элементов массива вместо простых переменных????????

Именно.
Не могу сообразить, как правильно построить цикл, чтобы существующий отсортированный массив загнать в строки.

Массив по print_r ($array) выводится такой:
( [0] => Array ( [price] => 001 [name] => Array ( [0] => 001 [1] => 21.09.2010 [2] => /news-start_1 [3] => Буратино [4] => Тест1 ) ) [1] => Array ( [price] => 002 [name] => Array ( [0] => 002 [1] => 21.09.2010 [2] => /news-new_screenshot [3] => Мальвина [4] => Заголовок 2 ) ) и т.д.

Я ж сразу написАл, что бестолковый... Потому и прошу помощи. Или я не в тот раздел форума попал?

Спустя 19 минут, 23 секунды (19.10.2010 - 20:06) twin написал(а):
    // ура, работает....
$newcontent = '';
foreach ($array as $num => $arr)
$newcontent .= implode('|', $arr['name']) ."\n";

Спустя 1 час, 33 минуты, 4 секунды (19.10.2010 - 21:39) Karev написал(а):
Цитата (twin @ 19.10.2010 - 21:06)
    // ура, работает....
$newcontent = '';
foreach ($array as $num => $arr)
    $newcontent .= implode('|', $arr['name']) ."\n";

Вот спасибо, добрый человек!

Всего две строки... Шаман!! biggrin.gif

Спустя 2 часа, 10 минут, 56 секунд (19.10.2010 - 23:50) Karev написал(а):
Один нюанс выяснился...
."\n" - лишнее, добавляет пустую строку в файл.
Правильнее получилось так:

$newcontent = '';
foreach ($array as $num => $arr)
$newcontent .= implode('|', $arr['name']);

Еще раз - спасибо за помощь.

Спустя 8 часов, 3 минуты, 33 секунды (20.10.2010 - 07:53) sergeiss написал(а):
Цитата (Karev @ 19.10.2010 - 22:39)
Всего две строки... Шаман!!

Алгоритм я тебе чуть раньше написал. Только ты не захотел подумать о нём...

Цитата (Karev @ 20.10.2010 - 00:50)
."\n" - лишнее, добавляет пустую строку в файл.

А ты как записываешь в файл? В цикле построчно или через file_put_contents?

Спустя 10 минут, 57 секунд (20.10.2010 - 08:04) twin написал(а):
Цитата
А ты как записываешь в файл? В цикле построчно или через file_put_contents?
А без разницы. Просто у него последний элемент массива содержит перенос строки, что по сути не верно. Нужно при чтении уничтожать его rtrim().
Но если скрипт только для сортировки, пойдет и так.

Спустя 3 часа, 58 минут, 22 секунды (20.10.2010 - 12:02) Karev написал(а):
Цитата (twin @ 20.10.2010 - 09:04)
Цитата
А ты как записываешь в файл? В цикле построчно или через file_put_contents?
А без разницы. Просто у него последний элемент массива содержит перенос строки, что по сути не верно. Нужно при чтении уничтожать его rtrim().
Но если скрипт только для сортировки, пойдет и так.

Именно так, только для сортировки. Я чуть выше уже писАл, что это небольшой модуль для доработки уже существующей у заказчика системы.

Про rtrim() - спасибо, буду знать теперь.

PS
Было бы, конечно, проще обратиться к профи и разом всё исправить, но проект благотворительный, поэтому приходится обходиться своими силами... Так что вскоре я вас здесь еще помучаю дурацкими вопросами. biggrin.gif

PPS
Не судите строго. Я не программист. И то что "конкатенация" - это не ругательство, узнал совсем недавно... biggrin.gif

Спустя 6 минут, 46 секунд (20.10.2010 - 12:09) Karev написал(а):
Цитата (sergeiss @ 20.10.2010 - 08:53)
Цитата (Karev @ 19.10.2010 - 22:39)
Всего две строки... Шаман!!

Алгоритм я тебе чуть раньше написал. Только ты не захотел подумать о нём...

Спасибо, с алгоритмом-то всё понятно, проблема была именно в реализации.
И "не захотел", а просто нЕчем подумать... biggrin.gif

Цитата (sergeiss @ 20.10.2010 - 08:53)

Цитата (Karev @ 20.10.2010 - 00:50)
."\n" - лишнее, добавляет пустую строку в файл.

А ты как записываешь в файл? В цикле построчно или через file_put_contents?

В цикле построчно.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.