Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   PHP (http://www.flasher.ru/forum/forumdisplay.php?f=20)
-   -   Сдвиг элементов массива (http://www.flasher.ru/forum/showthread.php?t=46943)

Монах 17.07.2003 22:30

Сдвиг элементов массива
 
Есть массив на, скажем, 10 элементов. Как сделать так, чтобы при записи новых данных в первую ячейку, элементы сдвигались на один... Тоесть тот, что был до перезаписи в первой ячейке, сдвигался во вторую, второй - в третью и т.л. Последний, 10-й, соответственно, пропадает.

Заранее благодарен.

nagash 18.07.2003 00:24

берёшь массив...
находишь куда надо вставить...
делаешь ещё один массив с добавлением нового значения в нужном месте...
перезаписываешь старый массив
=)

можно подзамарочиться с array_splice... он вырывает элементы... а ты вырываешь один элемент и вставляешь вырванный элемент с новым...
а вообще добавляй в конец array_push да сортируй

Монах 18.07.2003 01:58

Маленькое лирическое отступление... Тут другую штуку параллельно делаю, там тоже с 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");
}

}

Собственно, вопреки всему, оно не хочет выписывать "Ура, нашло" и менять . ;))

Тоже буду очень благодарен за найденную ошиПку...

nagash 18.07.2003 04:16

а ведь есть такие умные функции как array_search зачем цикл гонять? =)
Код:

<?
$text = array("raz","dva","tri","chetyre","pyat");
$search = "tri";
$i = array_search ($search, $text);
array_splice ($text, $i, 1, "sto");
print_r($text);
?>


Монах 18.07.2003 10:57

М-да, протупил... :D

Монах 18.07.2003 11:20

М-да, это все хорошо, но, что-то все же работать не хочет... В смысле не приведенный пример (он в полный рост работает), а мой...

Я просто массив свой вставляю из текстового файла, там эти значения в колонку располжены

raz
dva
tri
chetyre
pyat

Я их оттуда, не мудрствуя лукаво, так и вставляю
$text = file ('db.txt');

Смотрю print_r ($text); - нормальный массив получается с нужными элементами... Но когда array_search их искать начинает, он их не находит, обламывается и замещает требуемое значение в нулевую ячейку...

Что тут не так сделано?

nagash 18.07.2003 13:51

ты когда функцией file загоняешь фаил в массив у тебя на конце каждой переменной остаётся перенос строки...
циклом прогони trim() ; по всем элементам массива

for ($i=0;$i<count($text);$i++) {
$text[$i] = trim($text[$i]);
}

и должно всё запорхать =)

nagash 18.07.2003 14:10

ты когда функцией file загоняешь фаил в массив у тебя на конце каждой переменной остаётся перенос строки...
циклом прогони trim() ; по всем элементам массива

for ($i=0;$i<count($text);$i++) {
$text[$i] = trim($text[$i]);
}

и должно всё запорхать =)

Монах 18.07.2003 14:31

Сенкс. И еще такой вопрос: что бы такое сделать с txt файлом, чтобы его разным врагам нельзя было в явном виде в инете просмотреть... Там база подписчиков валяться будет - нехорошо спамерам на раграбление отдавать... :D

nagash 18.07.2003 14:47

положить его в директорию...
а в директории создать фаил .htaccess в нём написать


Deny from all

Монах 18.07.2003 15:18

Сенкс большое! Вот этого совсем не знал. А где можно подробнее почитать обо всем, чего можно в .htaccess пихать?

А то я до сих пор в .htaccess только кодировками, 404-й и CharsetRecodeMultipartForms пользовался... :rolleyes:

Да, кстати, а вот можно ли в файл записать массив, чтоб он как массив хранился, а не как набор строчек?

Оно, конечно, можно для записи цикл организовать типа

.........
for ($i=0;$i<count($text);$i++) {
fwrite($fp, $text[$i]);
}
.........

но потом данные все равно обратно в массив кидать...

nagash 18.07.2003 15:38

эм...
ну сам подумай...
что есть фаил?
правильно...
набор строчек...
а вот как ты их оттуда достанешь это уже твоё дело
=)

Монах 18.07.2003 16:31

Ну почему же... Можно и так записать:

$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");

Все зашибись, в результате нужный подписчик из базы удален, только вот одно меня смущает.. Ну пятьдесят подписчиков, ну сто, но когда их количество за полторы-две штуки перевалит... Оптимален ли такой способ ведения базы данных сабскрайберов?

nagash 18.07.2003 16:48

MySQL тебя спасёт...
для любителей файлов в ПХП 5.0++ поддержка по умолчанию SQLite
впринципе поддержка и в 4++ версиях есть но она по умолчанию отключена...
хочешь - заморочийся включи...
будет тебе текстовая база с запросами как в базе данных...

Монах 18.07.2003 16:56

Э-хе-хе... Да это понятно...

Знал бы я базы данных, не колбасился бы с файлами. :D Учить то учу понемногу, но щас надо быстренько набросать подписчиков, чтоб дело шло...

Хорошо, а подробнее о недостатках этих текстовиков? Я посмотрел, база данных на 2 штуки людей занимает в районе 40 килобайт... Какие могут возникнуть проблемы, если эти 40 килобайт туды-сюды таксать? Какие могут быть сбои? НЕ может ли так случится, что пока скрипт записывает в файл одного юзера, второй вызывает файл, получает его пустым, пишет в него свой адрес и перезаписывает поверх только со СВОИМ адресом, а вся база "тю-тю"? Или иные какие-то проблемы?

Pr0Head 18.07.2003 17:11

Может.

Для этого есть функция flock

Donal 18.07.2003 17:13

насчёт вставки в первый элемент массива
 
вообще говоря, есть функция array_unshift - добавляет элемент(ы) в начало массива, сдвигая остальные.
потом убираешь последний...

nagash 18.07.2003 17:14

MySQL намного проще чем ты думаешь...
да я щас и SQLite глянул тоже очень просто...
так что нет смысла устраивать себе мороку с файлами...

а если всё таки файлы - прохед прав... юзай http://www.php.net/flock

nagash 18.07.2003 17:16

Donal
а зачем ему это надо? =)
где написано что ему надо именно в начало вставить и последний элемент стереть?
внимательнее надо быть...

Donal 18.07.2003 17:31

Re: Сдвиг элементов массива
 
Цитата:

Оригинал написал(а) Монах
Есть массив на, скажем, 10 элементов. Как сделать так, чтобы при записи новых данных в первую ячейку, элементы сдвигались на один... Тоесть тот, что был до перезаписи в первой ячейке, сдвигался во вторую, второй - в третью и т.л. Последний, 10-й, соответственно, пропадает.

обращу отдельное внимание на
при записи новых данных в первую ячейку и
Последний, 10-й, соответственно, пропадает.

конечно, можно сказать, что первая ячейка не является началом массива, а началом является нулевая ячейка, но...

Монах 18.07.2003 17:41

2_nagash

Он на первую мессагу отвечает. Там действительно была такая задача... Залез на php.net, посмотрел примеры, пооже, таки да, это будет рулить лучше, чем дозапись старого массива в новый... Точнее, результат будет один и тот же, только код меньше. :D

На счет flock...

Это, насколько позволило мне понять мое мизерное знание английского, надо после fopen включить исключительную блокировку
flock( $fp, LOCK_EX );

... а перед fclose снять её?
flock( $fp, LOCK_UB );

Насколько я понял, если стоит LOCK_EX, то пока процесс работы с файлом одного юзверя не закончится, второй не сможет с ним работать, а запущенный вторым процесс будет дожидаться разблокировки и только потом начнет выполнять свои действия? Правильно понял?

nagash 18.07.2003 18:08

циферки лутше пиши...
flock ( $handle,2);

открывать ненадо...
фаил закрываешь и всё...

Монах 18.07.2003 18:19

А можно немного подробнее на счет циферок? Я циферок в руководстве не видел. :p Как они работают?

И что значит
"открывать ненадо...
фаил закрываешь и всё..."(с) ???

Файл открывать не надо? Или что открывать не надо? :D

nagash 18.07.2003 19:08

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....

а по поводу открывать я имел ввиду лок ненадо снимать... когда фаил закрываешь то всё автоматом туды сюды... =)

Монах 18.07.2003 20:57

Одним словом, вместо кучи букв можно ставить одну циферь. ;) Ясно. По поводу того, что разлочивать в конце необязательно - тоже ясно. ;) Просто на php.net в примерах разлочивают...

metton 19.07.2003 01:37

2nagash
Зачем цифры? Константы для того и придуманы (конечно, есть и другие применения - заранее не спорю), чтобы не заморачиваться с запоминанием чего-то абстрактного и не зависеть от конкретного значения, которое вполне может и измениться, а вот константа останется прежней.

nagash 19.07.2003 02:04

metton
что по мне так легче запомнить двойку чем слово, которое для меня так же асбтрактно как и цифра... =)

metton 20.07.2003 00:23

2nagash
Спорить не буду, но всё равно остаюсь при своём мнении. Сам раньше не очень понимал роли констант в таких случаях, но, писав программку на Си и переправляя по десять раз цифры (добавляя новые значения), понял, что, сколько бы я их не менял, я могу пользоваться константами и менять их значения сколько влезет.

Pietrovich 21.07.2003 03:36

Цитата:

Да, кстати, а вот можно ли в файл записать массив, чтоб он как массив хранился, а не как набор строчек?
serialize() и unserialize()
странно что об этом не сказали.

пакуй массив через serialize(), кидай в файло, потом достал оттуда, unserialize() и все у тебя на месте. правда файло станет наАамного толще.


З.Ы.: спать хочу, поэтому не вник в ответы, если были варианты лучше - простите, провтыкал.

Монах 03.08.2003 20:55

Лазил тут по форуму, наткнулся на следющую мессагу от 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()... Какие мнения?

nagash 03.08.2003 23:38

Монах
небезопасно...
это почему? =)))
ты хоть бы перевёл нормально...
вот когда переведёшь нормально тогда и поймёшь...
ИМХО всё нормально написано и никаких мыслей тут не может быть!

Монах 03.08.2003 23:46

2_nagash

Достаточно плохо с техн. английским. ;)

Да и доверчивый я. ;)


Часовой пояс GMT +4, время: 20:16.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.