Имеем:
Текстовый файл со строками:
номер новости | дата | 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) |
И вообще может что не так делаю... |
Забудь всё, что ты тут написал и переделай с использованием БД Это будет наиболее оптимально.
И в твоём случае, возможно, 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) | ||||
Даже SQLite? Если действительно нет возможности, то....
Просто "тупо" суммировать строки. $s1='oidjfsldj'; |
Даже SQLite, т.к. дописывается модуль под уже существующую, рабочую систему.. Заказчик ничего менять не хочет.
А как массив в строки-то загнать??
Спустя 3 минуты, 8 секунд (19.10.2010 - 10:06) sergeiss написал(а):
Цитата (Karev @ 19.10.2010 - 11:03) |
А как массив в строки-то загнать?? |
А это я кому написал, как ты думаешь?
Цитата (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) |
// ура, работает.... |
Вот спасибо, добрый человек!
Всего две строки... Шаман!!
Спустя 2 часа, 10 минут, 56 секунд (19.10.2010 - 23:50) Karev написал(а):
Один нюанс выяснился...
."\n" - лишнее, добавляет пустую строку в файл.
Правильнее получилось так:
Еще раз - спасибо за помощь.
."\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) | ||
А без разницы. Просто у него последний элемент массива содержит перенос строки, что по сути не верно. Нужно при чтении уничтожать его rtrim(). Но если скрипт только для сортировки, пойдет и так. |
Именно так, только для сортировки. Я чуть выше уже писАл, что это небольшой модуль для доработки уже существующей у заказчика системы.
Про rtrim() - спасибо, буду знать теперь.
PS
Было бы, конечно, проще обратиться к профи и разом всё исправить, но проект благотворительный, поэтому приходится обходиться своими силами... Так что вскоре я вас здесь еще помучаю дурацкими вопросами.
PPS
Не судите строго. Я не программист. И то что "конкатенация" - это не ругательство, узнал совсем недавно...
Спустя 6 минут, 46 секунд (20.10.2010 - 12:09) Karev написал(а):
Цитата (sergeiss @ 20.10.2010 - 08:53) | ||
Алгоритм я тебе чуть раньше написал. Только ты не захотел подумать о нём... |
Спасибо, с алгоритмом-то всё понятно, проблема была именно в реализации.
И "не захотел", а просто нЕчем подумать...
Цитата (sergeiss @ 20.10.2010 - 08:53) | ||
А ты как записываешь в файл? В цикле построчно или через file_put_contents? |
В цикле построчно.