![]() |
Сдвиг элементов массива
Есть массив на, скажем, 10 элементов. Как сделать так, чтобы при записи новых данных в первую ячейку, элементы сдвигались на один... Тоесть тот, что был до перезаписи в первой ячейке, сдвигался во вторую, второй - в третью и т.л. Последний, 10-й, соответственно, пропадает.
Заранее благодарен. |
берёшь массив...
находишь куда надо вставить... делаешь ещё один массив с добавлением нового значения в нужном месте... перезаписываешь старый массив =) можно подзамарочиться с array_splice... он вырывает элементы... а ты вырываешь один элемент и вставляешь вырванный элемент с новым... а вообще добавляй в конец array_push да сортируй |
Маленькое лирическое отступление... Тут другую штуку параллельно делаю, там тоже с array_splice работа, но не о том речь...
Вроде как элементарная штука, но почему-то не работает ;(( Раз не работает - должна быть ошибка. Но оную я в упор не вижу... Кусок листинга: $text = array("raz","dva","tri","chetyre","pyat"); $search = "tri"; for ($i=0; $i < count($text); $i++) { if ($text[$i] == $search){ print "Ура, нашло, щас поменяем"; array_splice ($text, $i, $i, "sto"); } } Собственно, вопреки всему, оно не хочет выписывать "Ура, нашло" и менять . ;)) Тоже буду очень благодарен за найденную ошиПку... |
а ведь есть такие умные функции как array_search зачем цикл гонять? =)
Код:
<? |
М-да, протупил... :D
|
М-да, это все хорошо, но, что-то все же работать не хочет... В смысле не приведенный пример (он в полный рост работает), а мой...
Я просто массив свой вставляю из текстового файла, там эти значения в колонку располжены raz dva tri chetyre pyat Я их оттуда, не мудрствуя лукаво, так и вставляю $text = file ('db.txt'); Смотрю print_r ($text); - нормальный массив получается с нужными элементами... Но когда array_search их искать начинает, он их не находит, обламывается и замещает требуемое значение в нулевую ячейку... Что тут не так сделано? |
ты когда функцией file загоняешь фаил в массив у тебя на конце каждой переменной остаётся перенос строки...
циклом прогони trim() ; по всем элементам массива for ($i=0;$i<count($text);$i++) { $text[$i] = trim($text[$i]); } и должно всё запорхать =) |
ты когда функцией file загоняешь фаил в массив у тебя на конце каждой переменной остаётся перенос строки...
циклом прогони trim() ; по всем элементам массива for ($i=0;$i<count($text);$i++) { $text[$i] = trim($text[$i]); } и должно всё запорхать =) |
Сенкс. И еще такой вопрос: что бы такое сделать с txt файлом, чтобы его разным врагам нельзя было в явном виде в инете просмотреть... Там база подписчиков валяться будет - нехорошо спамерам на раграбление отдавать... :D
|
положить его в директорию...
а в директории создать фаил .htaccess в нём написать Deny from all |
Сенкс большое! Вот этого совсем не знал. А где можно подробнее почитать обо всем, чего можно в .htaccess пихать?
А то я до сих пор в .htaccess только кодировками, 404-й и CharsetRecodeMultipartForms пользовался... :rolleyes: Да, кстати, а вот можно ли в файл записать массив, чтоб он как массив хранился, а не как набор строчек? Оно, конечно, можно для записи цикл организовать типа ......... for ($i=0;$i<count($text);$i++) { fwrite($fp, $text[$i]); } ......... но потом данные все равно обратно в массив кидать... |
эм...
ну сам подумай... что есть фаил? правильно... набор строчек... а вот как ты их оттуда достанешь это уже твоё дело =) |
Ну почему же... Можно и так записать:
$filename = $path; $fp = fopen($filename, 'w'); fwrite($fp, '<?'); fwrite($fp, "\n"); fwrite($fp, '$buka-byaka1 = '); fwrite($fp, $buka-byaka1); fwrite($fp, ';'); fwrite($fp, "\n"); fwrite($fp, '$buka-byaka2 = '); fwrite($fp, $buka-byaka2); fwrite($fp, ';'); fwrite($fp, "\n"); fwrite($fp, '?>'); fclose($fp); Писать, естественно, в PHP-шный файл... Тогда и при инклюде получим сразу готовые переменные со значением... Вот я и спрашивал, как ТАКИМ оборазом массив записать, чтобы потом этот массив сразу и получить... --------------------------------- Да, еще вот вопрос из области "а оптимально ли"... Допустим, затянул я базу данных из текстовика в скрипт, удалил таким вот образом подписчика: if (in_array($UserEmail,$text,TRUE)) { $i = array_search ($UserEmail, $text); array_splice ($text, $i, 1); } ... ПЕРЕзаписал обратно в текстовик: for ($i=0;$i<count($text);$i++) { fwrite($fp, $text[$i]); fwrite($fp, "\n"); Все зашибись, в результате нужный подписчик из базы удален, только вот одно меня смущает.. Ну пятьдесят подписчиков, ну сто, но когда их количество за полторы-две штуки перевалит... Оптимален ли такой способ ведения базы данных сабскрайберов? |
MySQL тебя спасёт...
для любителей файлов в ПХП 5.0++ поддержка по умолчанию SQLite впринципе поддержка и в 4++ версиях есть но она по умолчанию отключена... хочешь - заморочийся включи... будет тебе текстовая база с запросами как в базе данных... |
Э-хе-хе... Да это понятно...
Знал бы я базы данных, не колбасился бы с файлами. :D Учить то учу понемногу, но щас надо быстренько набросать подписчиков, чтоб дело шло... Хорошо, а подробнее о недостатках этих текстовиков? Я посмотрел, база данных на 2 штуки людей занимает в районе 40 килобайт... Какие могут возникнуть проблемы, если эти 40 килобайт туды-сюды таксать? Какие могут быть сбои? НЕ может ли так случится, что пока скрипт записывает в файл одного юзера, второй вызывает файл, получает его пустым, пишет в него свой адрес и перезаписывает поверх только со СВОИМ адресом, а вся база "тю-тю"? Или иные какие-то проблемы? |
Может.
Для этого есть функция flock |
насчёт вставки в первый элемент массива
вообще говоря, есть функция array_unshift - добавляет элемент(ы) в начало массива, сдвигая остальные.
потом убираешь последний... |
MySQL намного проще чем ты думаешь...
да я щас и SQLite глянул тоже очень просто... так что нет смысла устраивать себе мороку с файлами... а если всё таки файлы - прохед прав... юзай http://www.php.net/flock |
Donal
а зачем ему это надо? =) где написано что ему надо именно в начало вставить и последний элемент стереть? внимательнее надо быть... |
Re: Сдвиг элементов массива
Цитата:
при записи новых данных в первую ячейку и Последний, 10-й, соответственно, пропадает. конечно, можно сказать, что первая ячейка не является началом массива, а началом является нулевая ячейка, но... |
2_nagash
Он на первую мессагу отвечает. Там действительно была такая задача... Залез на php.net, посмотрел примеры, пооже, таки да, это будет рулить лучше, чем дозапись старого массива в новый... Точнее, результат будет один и тот же, только код меньше. :D На счет flock... Это, насколько позволило мне понять мое мизерное знание английского, надо после fopen включить исключительную блокировку flock( $fp, LOCK_EX ); ... а перед fclose снять её? flock( $fp, LOCK_UB ); Насколько я понял, если стоит LOCK_EX, то пока процесс работы с файлом одного юзверя не закончится, второй не сможет с ним работать, а запущенный вторым процесс будет дожидаться разблокировки и только потом начнет выполнять свои действия? Правильно понял? |
циферки лутше пиши...
flock ( $handle,2); открывать ненадо... фаил закрываешь и всё... |
А можно немного подробнее на счет циферок? Я циферок в руководстве не видел. :p Как они работают?
И что значит "открывать ненадо... фаил закрываешь и всё..."(с) ??? Файл открывать не надо? Или что открывать не надо? :D |
To acquire a shared lock (reader), set operation to LOCK_SH (set to 1 prior to PHP 4.0.1).
To acquire an exclusive lock (writer), set operation to LOCK_EX (set to 2 prior to PHP 4.0.1). To release a lock (shared or exclusive), set operation to LOCK_UN (set to 3 prior to PHP 4.0.1). If you don't want flock() to block while locking, add LOCK_NB (4 prior to PHP 4.0.1) to operation. повнимательнее... set to 1 set to 2.... а по поводу открывать я имел ввиду лок ненадо снимать... когда фаил закрываешь то всё автоматом туды сюды... =) |
Одним словом, вместо кучи букв можно ставить одну циферь. ;) Ясно. По поводу того, что разлочивать в конце необязательно - тоже ясно. ;) Просто на php.net в примерах разлочивают...
|
2nagash
Зачем цифры? Константы для того и придуманы (конечно, есть и другие применения - заранее не спорю), чтобы не заморачиваться с запоминанием чего-то абстрактного и не зависеть от конкретного значения, которое вполне может и измениться, а вот константа останется прежней. |
metton
что по мне так легче запомнить двойку чем слово, которое для меня так же асбтрактно как и цифра... =) |
2nagash
Спорить не буду, но всё равно остаюсь при своём мнении. Сам раньше не очень понимал роли констант в таких случаях, но, писав программку на Си и переправляя по десять раз цифры (добавляя новые значения), понял, что, сколько бы я их не менял, я могу пользоваться константами и менять их значения сколько влезет. |
Цитата:
странно что об этом не сказали. пакуй массив через serialize(), кидай в файло, потом достал оттуда, unserialize() и все у тебя на месте. правда файло станет наАамного толще. З.Ы.: спать хочу, поэтому не вник в ответы, если были варианты лучше - простите, провтыкал. |
Лазил тут по форуму, наткнулся на следющую мессагу от Crazy относительно flock():
"Правильным решением является НЕиспользование этой функции. Ибо сказано: -------------------------------------------------------------------------------- Warning flock() will not work on NFS and many other networked file systems. Check your operating system documentation for more details. On some operating systems flock() is implemented at the process level. When using a multithreaded server API like ISAPI you may not be able to rely on flock() to protect files against other PHP scripts running in parallel threads of the same server instance! -------------------------------------------------------------------------------- Т.е. если это не твой личный комп и ты не имеешь полного контроля над ним, то пользоваться этой функцией по меньшей мере небезопасно."© Вот и думаю на счет этого flock()... Какие мнения? |
Монах
небезопасно... это почему? =))) ты хоть бы перевёл нормально... вот когда переведёшь нормально тогда и поймёшь... ИМХО всё нормально написано и никаких мыслей тут не может быть! |
2_nagash
Достаточно плохо с техн. английским. ;) Да и доверчивый я. ;) |
| Часовой пояс GMT +4, время: 20:16. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.