[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: как добавить массив в новую строку?
Vikt0r
Хочу извинится заранее, если эта тема уже где-то пробегала...

В общем есть файл с многомерными массивами: menu.php

PHP
<?
$mn = array(=> array(=> "Подключение",=> "connect.html",=> "1",),
"2" => array(=> "Карты",=> "maps.html",=> "1",),
"3" => array(=> "Программы"=> "progs.html",=> "1",),
"4" => array(=> "Платные услуги",=> "yslugi.html",=> "2",),
"5" => array(=> "Способы оплаты",=> "sposob_oplatu.html",=> "2",),
);


Проблема состоит в следующем, написать скрипт, который изменяет эти данные то написал, а вот как добавить Новые данные после 5 строки (то есть 5го элемента я не догадываюсь)...

то есть нужно, чтобы данные, которые я добавляю, записывались не в строку после такого кода ); ?>, а после 5 елемента, а именно:

PHP
<?
$mn = array(=> array(=> "Подключение",=> "connect.html",=> "1",),
"2" => array(=> "Карты",=> "maps.html",=> "1",),
"3" => array(=> "Программы"=> "progs.html",=> "1",),
"4" => array(=> "Платные услуги",=> "yslugi.html",=> "2",),
"5" => array(=> "Способы оплаты",=> "sposob_oplatu.html",=> "2",),

// НОВЫЕ ЗНАЧЕНИЯ
"6" => array(=> "Меню 2",=> "menu2.html",=> "2",),
"7" => array(=> "Меню 3",=> "menu3.html",=> "2",),
);


Очень надеюсь на вашу помощь! заранее благодарю!



Спустя 8 минут, 17 секунд (27.03.2009 - 18:16) sergeiss написал(а):
Я не понял - ты хочешь динамически меню менять или оно делается раз и надолго?
По-моему, проще сделать это в текстовом редакторе. И не только проще, но и быстрее.

Спустя 7 минут, 17 секунд (27.03.2009 - 18:23) Viking написал(а):
имхо одна из тех задач, с которыми сталкиваются исключительно новички smile.gif
если я правильно понял, то надо прочитать этот файл, убрать из конца ");?>", вычислить регуляркой или substr последний номер, увеличить его, дописать данные с этим номером, добавить ");?>" и наконец записать файл обратно

Спустя 1 час, 51 минута, 17 секунд (27.03.2009 - 20:14) Vikt0r написал(а):
Цитата (sergeiss @ 27.03.2009 - 15:16)
Я не понял - ты хочешь динамически меню менять или оно делается раз и надолго?
По-моему, проще сделать это в текстовом редакторе. И не только проще, но и быстрее.

Я навел как пример, использоваться будет по двум назначениям.... и в принципе не для себя, а в раздел администрирования. где люди смогут когда угодно изменить данные на которые им нужно...

Самое обидное, что как изменять все эти данные я смог написать, а как добавить новые строки, не получается.... 4 часа что сидел что не сидел за компьютером!

Пробовал при добавлении делать кодом

str_replace("); ?>", "$данные отправленные с формы );?>", $массив);

но так что-то не получается....

есть идея еще сделать через обычный цикл типа

$file = file('menu.php');
for($i=0; $i<count($file); $i++)
{
// находим нужную нам строку которую хотим заменить
if($i == 6) {данные записываются в 6 строку}else{старые не меняются}
}

но проблема тогда возникнет следующая, если строки будут такого типа

PHP
<?
$mn = array(=> array(=> "Подключение",=> "connect.html",=> "1",),"2" => array(=> "Карты",=> "maps.html",=> "1",),"3" => array(=> "Программы"=> "progs.html",=> "1",),"4" => array(=> "Платные услуги",=> "yslugi.html",=> "2",),"5" => array(=> "Способы оплаты",=> "sposob_oplatu.html",=> "2",),
);

Тогда и скрипт будет нарушаться.... помогите пожалуйста решить проблему.

Спустя 50 минут, 11 секунд (27.03.2009 - 21:04) Kuliev написал(а):
Может есть смысл все это в файле держать скажем menu.inc
внутри чтото типа
Цитата

Подключение|connect.html
Карты|maps.html


Чтото типа того, хотя я не уверен, но думаю что это один из вариантов! huh.gif

Спустя 7 минут, 18 секунд (27.03.2009 - 21:12) sergeiss написал(а):
Автору темы: вообще, я очень настойчиво предлагаю забыть про предложенную тобой идею, немного ее переиначить, и сделать по-другому.

Вариантов тут 2: хранить данные в простом текстовом файле или в БД. Собственно, второй вариант - это по своей сути те же файлы smile.gif, только еще с довеском в виде некоей программы управления (в т.ч. с контролем целостности данных).

Если данные меняются нечасто (а скорее всего, так оно и есть), то можно просто в файле хранить. С разделителями.
Например,
Код
1;Подключение;connect.html;1
2;Карты;maps.html;1
3;Программы;progs.html;1
4;Платные услуги;yslugi.html;2

ну и так далее.

Преимущества:
1. Ты всегда легко и просто загрузишь эти данные в массивы и сможешь с ними работать - код скрипта получается неизменный.
2. Добавление и удаление строк данных намного легче, чем в предложенном тообой варианте.

Недостатки. Если данные меняются редко, то недостатков нету smile.gif

PS. И опять опередили с ответом, пока я "растекался мысль по древу" smile.gif

Спустя 9 минут, 13 секунд (27.03.2009 - 21:21) Vikt0r написал(а):
Цитата (sergeiss @ 27.03.2009 - 18:12)
Автору темы: вообще, я очень настойчиво предлагаю забыть про предложенную тобой идею, немного ее переиначить, и сделать по-другому.

Вариантов тут 2: хранить данные в простом текстовом файле или в БД. Собственно, второй вариант - это по своей сути те же файлы smile.gif, только еще с довеском в виде некоей программы управления (в т.ч. с контролем целостности данных).

Если данные меняются нечасто (а скорее всего, так оно и есть), то можно просто в файле хранить. С разделителями.
Например,
Код
1;Подключение;connect.html;1
2;Карты;maps.html;1
3;Программы;progs.html;1
4;Платные услуги;yslugi.html;2

ну и так далее.

Преимущества:
1. Ты всегда легко и просто загрузишь эти данные в массивы и сможешь с ними работать - код скрипта получается неизменный.
2. Добавление и удаление строк данных намного легче, чем в предложенном тообой варианте.

Недостатки. Если данные меняются редко, то недостатков нету smile.gif

PS. И опять опередили с ответом, пока я "растекался мысль по древу" smile.gif

знакомый предложил использовать команду explode для разбивки символов.... как вам такой вариант?

PHP
<?php
$a
="1
2
3
4
5
6
7
8
9
);
?>"
;
$b=explode(");", $a);
$c="Какая то фигня и куча цифр 28923489 23984238947 23897489237";
$b['0']=$b['0'].$c.");".$b['1'];
print_r ($b);

Сам еще не практиковал как при добавлении будет...

Менять код или формат данных не хочется в виде обычные файлики, потому что скрипт который написал - смотрится довольно не плохо, а из-за добавление строки не хочется все менять, проще найти решение!

неужели трудно придумать что-то для каких-то строк )

кто еще не понял, обясню доступнее и пугайтесь вы этим массивом, не смотрите на него вообще...

есть числа

<?
(
1
2
3
4
5
);
?>

мне просто нужно чтобы ВСЕ числа из формы добавлялись в строку до знака ); ?>

то есть так:

<?
(
1
2
3
4
5

6
7
8
9
);
?>

неужели никто с подобным не сталкивался? тут по логике ничего сложного

Спустя 2 минуты, 36 секунд (27.03.2009 - 21:24) kirik написал(а):
Цитата (Vikt0r @ 27.03.2009 - 13:21)
тут по логике ничего сложного

на практике тоже. Только тебе советуют как это сделать проще, и не лечить гланды, если они не болят.

Спустя 4 минуты, 3 секунды (27.03.2009 - 21:28) Kuliev написал(а):
Vikt0r
Нормальный Вам вариант подкинули, пишется за 10 минут.
PHP
<?php
// Пример 1
$pizza  "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces explode(" "$pizza);
echo 
$pieces[0]; // piece1
echo $pieces[1]; // piece2

// Пример 2
$data "foo:*:1023:1000::/home/foo:/bin/sh";
list(
$user$pass$uid$gid$gecos$home$shell) = explode(":"$data);
echo 
$user// foo
echo $pass// *



Спустя 4 минуты, 11 секунд (27.03.2009 - 21:32) kirik написал(а):
Цитата (Vikt0r @ 27.03.2009 - 13:21)
мне просто нужно чтобы ВСЕ числа из формы добавлялись в строку до знака ); ?>


PHP
function getEnd($num)
{
    return 
$num."\n".($num+1)."\n);\n?>";
}

$str '<?
(
1
2
3
4
5

6
7
8
9
);
?>'
;

echo 
'<xmp>'.preg_replace("/(\d+)\n\);\n\?\>/e"'getEnd(\\1)'$str).'</xmp>';

Спустя 53 минуты, 54 секунды (27.03.2009 - 22:26) twin написал(а):
А мне больше нравится работать с массивом, как с массивом, а не как со строкой:
PHP
<?php
include("menu.php");
# Тут с массивом можешь делать что в голову взбредет.
$new1 = array(=> "Меню 2"=> "menu2.html"=> "2");
$new2 = array(=> "Меню 3"=> "menu3.html"=> "2");
# Допустим прибавим новые строчки
$mn[] = $new1;
$mn[] = $new2;

ob_start();
foreach(
$mn as $arr)
{
echo 
'array(';
 
    foreach(
$arr as $key => $val)
    echo 
"\"".$key."\" => \"".$val."\",";
echo 
"),\r\n";    
}

$str ob_get_contents();  
ob_end_clean();
$str str_replace(",),","),",$str);
$str trim($str",\r\n");

file_put_contents("menu.php""<?php\r\n\$mn = array(".$str."\r\n);\r\n?>"); 

Спустя 6 минут, 45 секунд (27.03.2009 - 22:32) sergeiss написал(а):
Цитата (twin @ 27.03.2009 - 22:26)
А мне больше нравится работать с массивом, как с массивом, а не как со строкой

Так это и правильно smile.gif Вопрос только в том, что товаристч хочет этот самый массив формировать за счет записи данных в файл в формате текста ПХП. Да еще при этом не знает, будут ли у него данные в одну строку записаны или в несколько строк.

Спустя 5 минут, 43 секунды (27.03.2009 - 22:38) twin написал(а):
Ну дык все так и работает ващето...

Спустя 25 минут, 33 секунды (27.03.2009 - 23:04) sergeiss написал(а):
Ты не понял, по-моему smile.gif Он хочет не просто записать данные в ПХП файл, а динамически их менять!!!
Какой-то другой скрипт отработал, принял данные от пользователя, то взял первый скрипт, и изменил в нем данные.

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

Спустя 17 минут, 37 секунд (27.03.2009 - 23:21) twin написал(а):
Наверное я действительно не понял... Какая разница, в середине или в конце или в начале... Скрипт то все равно один. Ну принял данные, добавил в массив и перезаписал файл... Или убрал наоборот. Вопрос в том, что по такой схеме это не просто текстовое хранилище, а часть работающего скрипта. Куда динамичнее то. А отработал - слил данные опять же в него и спи спокойно... По моему проще не бывает.
По порядку,
1. Подключаем файл с этим пресловутым массивом.
2. обрабатываем массив как душе угодно.
3. преобразуем в текст
4. перезаписываем файл. тот же самый.
Следующий заход:
1. Подключаем файл с УЖЕ НОВЫМ массивом.
2. обрабатываем массив как душе угодно.
далее по тексту

Спустя 14 часов, 15 минут, 47 секунд (28.03.2009 - 13:37) Vikt0r написал(а):
Цитата (twin @ 27.03.2009 - 19:26)
А мне больше нравится работать с массивом, как с массивом, а не как со строкой:
PHP
<?php
include("menu.php");
# Тут с массивом можешь делать что в голову взбредет.
$new1 = array(=> "Меню 2", 2 => "menu2.html", 3 => "2");
$new2 = array(=> "Меню 3", 2 => "menu3.html", 3 => "2");
# Допустим прибавим новые строчки
$mn[] = $new1;
$mn[] = $new2;

ob_start();
foreach(
$mn as $arr)
{
echo 'array(';
 
    foreach
($arr as $key => $val)
    echo "\"".$key."\" => \"".$val."\",";
echo "),\r\n";    
}

$str = ob_get_contents();  
ob_end_clean
();
$str = str_replace(",),","),",$str);
$str = trim($str, ",\r\n");

file_put_contents("menu.php", "<?php\r\n\$mn = array(".$str."\r\n);\r\n?>");<

ооооооооуу, накоец-то, работает супер! то что и хотел можно сказать!! осталось только реализовать на сайт с передачей данных с формы.....

остальные пока не проверял, всем огромное спасибо за участие и помощь!!!

Спустя 2 часа, 56 минут, 33 секунды (28.03.2009 - 16:34) Vikt0r написал(а):
Кому интересно что я хотел увидеть из всего, смотрим полную реализацию скрипта

PHP
<?php
include("mn.php");
?>

<form method='post'>
<input type='text' name='n1'>
<input type='text' name='n2'>
<input type='text' name='n3'>
<input type='submit' name='add' value='ok'>
</form>

<?
if(isset($add))
{
# Тут с массивом можешь делать что в голову взбредет.
$new = array(=> "$n1"=> "$n2"=> "$n3");

# Допустим прибавим новые строчки
$mn[] = $new;

ob_start();
foreach(
$mn as $arr => $arr2)
{

echo 
"\"$arr\" => array(";

$m1 $mn[$arr][1];
$m2 $mn[$arr][2];
$m3 $mn[$arr][3];
?>1 => "<?=$m1;?>", 2 => "<?=$m2;?>", 3 => "<?=$m3;?>"<?
echo "),\r\n";    
}

$str ob_get_contents();  
ob_end_clean();
$str str_replace(",),","),",$str);
$str trim($str",\r\n");

file_put_contents("mn.php""<?php\r\n\$mn = array(\r\n".$str."\r\n);\r\n?>");
}

Спустя 2 месяца, 4 дня, 2 часа, 59 минут, 42 секунды (2.06.2009 - 18:33) Vikt0r написал(а):
Цитата (Vikt0r @ 28.03.2009 - 13:34)
Кому интересно что я хотел увидеть из всего, смотрим полную реализацию скрипта

PHP
<?php
include("mn.php");
?>

<form method='post'>
<input type='text' name='n1'>
<input type='text' name='n2'>
<input type='text' name='n3'>
<input type='submit' name='add' value='ok'>
</form>

<?
if(isset($add))
{
# Тут с массивом можешь делать что в голову взбредет.
$new = array(=> "$n1", 2 => "$n2", 3 => "$n3");

# Допустим прибавим новые строчки
$mn[] = $new;

ob_start();
foreach(
$mn as $arr => $arr2)
{

echo "\"$arr\" => array(";

$m1 = $mn[$arr][1];
$m2 = $mn[$arr][2];
$m3 = $mn[$arr][3];
?>1 => "<?=$m1;?>", 2 => "<?=$m2;?>", 3 => "<?=$m3;?>"<?
echo 
"),\r\n";    
}

$str = ob_get_contents();  
ob_end_clean
();
$str = str_replace(",),","),",$str);
$str = trim($str, ",\r\n");

file_put_contents("mn.php", "<?php\r\n\$mn = array(\r\n".$str."\r\n);\r\n?>");
}

Помогите пожалуйста.....

не могу понять, почему перестал работать скрипт на серваке.

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

даже если для теста прописать в коде ниже строки

PHP
file_put_contents("mn.php", "<?php\r\n\$mn = array(\r\n".$str."\r\n);\r\n?>");


header('Location: test.php');

то перессылка не происходит, как я понял сервер даже не обрабатывает написаный код, раз не доходит до перессылки.

в чем может быть проблема? почему на локальной машине работает превосходно, а на серваке не хочет? и что самое интересное, что раньше работало также хорошо, даже код не менялся (может что на серваке в настройках нарушено?)

не могу также воспользоваться кодом error_reporting (E_ALL);, чтобы увидеть ошибки.....

Спустя 4 минуты, 1 секунда (2.06.2009 - 18:37) Vikt0r написал(а):
Кстати, если убрать последнюю строку
PHP
file_put_contents("mn.php""<?php\r\n\$mn = array(\r\n".$str."\r\n);\r\n?>");

то перессылка работает, что-то в этом коде не хочет обрабатывать

Спустя 1 минута, 59 секунд (2.06.2009 - 18:39) twin написал(а):
Скорее всего дело в версии php. Нужна не ниже 5-й. Обычно можно выбрать на хостинге, но если будет проблема, можно переписать ф-ю file_put_contents() на свою.

Спустя 5 минут, 40 секунд (2.06.2009 - 18:45) Vikt0r написал(а):
Цитата (twin @ 2.06.2009 - 15:39)
Скорее всего дело в версии php. Нужна не ниже 5-й. Обычно можно выбрать на хостинге, но если будет проблема, можно переписать ф-ю file_put_contents() на свою.

да, действитеьно на серваке PHP Version 4.3.9

подскажите, пожалуйста, как этот код можно переделать для этой версии?

Спустя 25 минут, 33 секунды (2.06.2009 - 19:11) twin написал(а):
Да посмотри внимательно на хостинге. Сейчас практически на всех есть пятерка. Просто нужно её включить. В панели обычно есть такая фишка. Эта функция гораздо стабильней и безопасней, чем огород из fopen() и fwrite()

Спустя 5 минут, 16 секунд (2.06.2009 - 19:16) Vikt0r написал(а):
Цитата (twin @ 2.06.2009 - 16:11)
Да посмотри внимательно на хостинге. Сейчас практически на всех есть пятерка. Просто нужно её включить. В панели обычно есть такая фишка. Эта функция гораздо стабильней и безопасней, чем огород из  fopen() и fwrite()

у меня нет доступа к панеле - только фтп доступ)

попробую с администрацией пообщаться на счет обновления до 5 версии.

спасибо

Спустя 12 часов, 5 минут, 12 секунд (3.06.2009 - 07:21) glock18 написал(а):
Vikt0r вообще возможно еще два варианта "топором":

1. "долгий" открываешь файл с маркером a, затем передвигаешь курсор на 3-4 позиции назад, и рисуешь новые элементы.

2. "короткий" закрывающий тег ?> не обязателен в php. Более того его часто не ставят в конце файла. Если у тебя он в конце файла - ты можешь просто убрать его. Ни на чего не натолкнуло?

PS: начал писать не увидев еще 2 страницы.

Спустя 15 часов, 15 минут, 35 секунд (3.06.2009 - 22:37) Vikt0r написал(а):
Цитата (glock18 @ 3.06.2009 - 04:21)
Vikt0r вообще возможно еще два варианта "топором":

1. "долгий" открываешь файл с маркером a, затем передвигаешь курсор на 3-4 позиции назад, и рисуешь новые элементы.

2. "короткий" закрывающий тег ?> не обязателен в php. Более того его часто не ставят в конце файла. Если у тебя он в конце файла - ты можешь просто убрать его. Ни на чего не натолкнуло?

PS: начал писать не увидев еще 2 страницы.

Я б с удовольствием правил бы и ручками, тем более если разделы будут создаваться раз в месяц ) но делал админку с целью того, чтобы меня не трогали постоянно люди, чтобы создать раздел...

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

хотел изначально делать все в файлах в виде .dat, там все намного проще! Но так получилось, что захотелось ради спортивного интереса держать эти два файлика в массиве и посмотреть как они вообще работают.....

конечно же, Огромное спасибо этому форуму, и товарищам, которые оперативненько помогут в любой ситуации....

Спустя 5 часов, 1 минута, 15 секунд (4.06.2009 - 03:38) twin написал(а):
Попробуй в .htaccess нагло сунуть это:
Код
AddType application/x-httpd-php5 .php

Может пролезет...
Быстрый ответ:

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