function parse_ini ( $filepath ) {
$ini = file( $filepath );
if ( count( $ini ) == 0 ) { return array(); }
$sections = array();
$values = array();
$globals = array();
$i = 0;
foreach( $ini as $line ){
$line = trim( $line );
// Comments
if ( $line == '' || $line{0} == ';' ) { continue; }
// Sections
if ( $line{0} == '[' ) {
$sections[] = substr( $line, 1, -1 );
$i++;
continue;
}
// Key-value pair
list( $key, $value ) = explode( '=', $line, 2 );
$key = trim( $key );
$value = trim( $value );
if ( $i == 0 ) {
// Array values
if ( substr( $line, -1, 2 ) == '[]' ) {
$globals[ $key ][] = $value;
} else {
$globals[ $key ] = $value;
}
} else {
// Array values
if ( substr( $line, -1, 2 ) == '[]' ) {
$values[ $i - 1 ][ $key ][] = $value;
} else {
$values[ $i - 1 ][ $key ] = $value;
}
}
}
for( $j=0; $j<$i; $j++ ) {
$result[ $sections[ $j ] ] = $values[ $j ];
}
return $result + $globals;
}
помогите с остальными функциями для чтения и записи ини файла ну чтобы примерно синтаксис использования был таков:
ini_read("section", "key"); //для чтения
ini_write("section", "key", $value); //для записи
Спустя 1 час, 44 минуты, 10 секунд (10.04.2011 - 10:14) T1grOK написал(а):
Версия php какая? Потому как в 5.3.1, есть специальный механизм для работы с ini файлами.
Спустя 3 минуты, 36 секунд (10.04.2011 - 10:18) Let4ik_Russia написал(а):
Цитата (T1grOK @ 10.04.2011 - 07:14) |
Версия php какая? Потому как в 5.3.1, есть специальный механизм для работы с ini файлами. |
Что за механизм можно поподробнее??? PHP Version 5.2.4
Спустя 6 часов, 53 минуты, 13 секунд (10.04.2011 - 17:11) Let4ik_Russia написал(а):
Ну будьте человеками, помогите...парюсь уже неделю с этим вопросом!
Спустя 18 минут, 48 секунд (10.04.2011 - 17:30) Raito-kun написал(а):
можно поподробней насчет
Цитата |
parse_ini_file не подходит |
?
parse_ini_file отлично подходит для работы с ini файлами.
чтение производится через ключи получившегося массива, запись этой функцией:
я бы не использовал кустарные функции, когда есть хороший стандартный инструмент из php.net
parse_ini_file отлично подходит для работы с ini файлами.
чтение производится через ключи получившегося массива, запись этой функцией:
function write_ini_file($path, $assoc_arr) {
$content = "";
foreach ($assoc_arr as $key=>$elem) {
if (is_array($elem)) {
if ($key != '') {
$content .= "[".$key."]\r\n";
}
foreach ($elem as $key2=>$elem2) {
if ($this->beginsWith($key2,'Comment_') == 1 && $this->beginsWith($elem2,';')) {
$content .= $elem2."\r\n";
}
else if ($this->beginsWith($key2,'Newline_') == 1 && ($elem2 == '')) {
$content .= $elem2."\r\n";
}
else {
$content .= $key2." = ".$elem2."\r\n";
}
}
}
else {
$content .= $key." = ".$elem."\r\n";
}
}
if (!$handle = fopen($path, 'w')) {
return -2;
}
if (!fwrite($handle, $content)) {
return -2;
}
fclose($handle);
return 1;
}
я бы не использовал кустарные функции, когда есть хороший стандартный инструмент из php.net
Спустя 19 минут (10.04.2011 - 17:49) Let4ik_Russia написал(а):
Цитата (Raito-kun @ 10.04.2011 - 14:30) | ||
можно поподробней насчет
? parse_ini_file отлично подходит для работы с ini файлами. |
как я писал выше в конфиг файле в ключах присутствую "()" скобки parse_ini_file, к сожалению, не воспринимает этого из-за чего и получается ошибка при чтении и записи файла, а изменить этот ключ я не могу так как он используется не только моим приложением...
Спустя 6 минут, 5 секунд (10.04.2011 - 17:55) Raito-kun написал(а):
я не понимаю, специально протестил сейчас запись и чтение такого конфига:
все отлично считалось и записалось.
кинь кусок в котором по твоему мнению возникает ошибка, переименуй, я попробую.
[SomeIniFile]
(One) = (one)
Two = two
все отлично считалось и записалось.
кинь кусок в котором по твоему мнению возникает ошибка, переименуй, я попробую.
Спустя 7 минут, 7 секунд (10.04.2011 - 18:02) Let4ik_Russia написал(а):
Цитата (Raito-kun @ 10.04.2011 - 14:55) |
я не понимаю, специально протестил сейчас запись и чтение такого конфига:[SomeIniFile] все отлично считалось и записалось |
ты считывал функцией parse_ini_file? а какая версия php у тебя?
вот кусок файла на котором происходит ошибка чтения
Lease (minutes)=2880
Спустя 3 минуты, 59 секунд (10.04.2011 - 18:06) Raito-kun написал(а):
да. версия 5.2.10. да тут не в версии дело, если у тебя есть поддержка этой функции.
у тебя секции в ini-файле присутствуют? не забываешь ставить второй аргумент true?
у тебя секции в ini-файле присутствуют? не забываешь ставить второй аргумент true?
Спустя 1 минута, 4 секунды (10.04.2011 - 18:07) Raito-kun написал(а):
нет, все-таки у меня проблем не возникло
Спустя 1 минута, 29 секунд (10.04.2011 - 18:08) Let4ik_Russia написал(а):
Цитата (Raito-kun @ 10.04.2011 - 15:06) |
да. версия 5.2.10. да тут не в версии дело, если у тебя есть поддержка этой функции. у тебя секции в ini-файле присутствуют? не забываешь ставить второй аргумент true? |
просто если удаляю этот параметр в котором ощибка файл нормально читается и записывается...покажи плиз полность функции которыми ты пользуешься для чтения и для записи.
Нет дело не в пробеле, только что специально проверил, убрал скобки , пробел оставил...все нормально...ставлю скобки появляется ошибка
Спустя 3 минуты, 14 секунд (10.04.2011 - 18:12) Let4ik_Russia написал(а):
Цитата (Raito-kun @ 10.04.2011 - 15:07) |
нет, все-таки у меня проблем не возникло |
покажи плиз функции...возможно это решит проблему мою))
Спустя 1 минута, 42 секунды (10.04.2011 - 18:13) Raito-kun написал(а):
$ini = parse_ini_file("1.ini", true);
$config = array("FirstSection" =>
array("O (ne)" => 'one',
"Two" => 'two')
);
write_ini_file("1.ini", $config);
function write_ini_file($path, $assoc_arr) {
$content = "";
foreach ($assoc_arr as $key=>$elem) {
if (is_array($elem)) {
if ($key != '') {
$content .= "[".$key."]\r\n";
}
foreach ($elem as $key2=>$elem2) {
if (my_str_begins_with($key2,'Comment_') == 1 && my_str_begins_with($elem2,';')) {
$content .= $elem2."\r\n";
}
else if (my_str_begins_with($key2,'Newline_') == 1 && ($elem2 == '')) {
$content .= $elem2."\r\n";
}
else {
$content .= $key2." = ".$elem2."\r\n";
}
}
}
else {
$content .= $key." = ".$elem."\r\n";
}
}
if (!$handle = fopen($path, 'w')) {
return false;
}
if (!fwrite($handle, $content)) {
return false;
}
fclose($handle);
return true;
}
function my_str_begins_with($str, $sub) {
return ( substr( $str, 0, strlen( $sub ) ) === $sub );
}
подправил.
Спустя 7 минут, 20 секунд (10.04.2011 - 18:21) Let4ik_Russia написал(а):
Цитата (Raito-kun @ 10.04.2011 - 15:13) |
|
а это что за функция?))
Спустя 1 минута, 43 секунды (10.04.2011 - 18:22) Raito-kun написал(а):
действительно варнинг возникает, но не мешает работе. почему - не знаю. поставь
@parse_ini_fileпока не найдем причину. или проигнорь, если проблем не возникает.
Спустя 2 минуты, 36 секунд (10.04.2011 - 18:25) Let4ik_Russia написал(а):
Цитата (Raito-kun @ 10.04.2011 - 15:22) |
действительно варнинг возникает, но не мешает работе. почему - не знаю. поставь@parse_ini_fileпока не найдем причину. или проигнорь, если проблем не возникает. |
дак вот я использую PHP Devel Studio, так что ошибка мне очень мешает...
Спустя 8 минут, 36 секунд (10.04.2011 - 18:34) Raito-kun написал(а):
Цитата |
а это что за функция?)) |
это для того, чтобы правильно вставлять комменты и новые строки. вот так попробуй:
$config = array("FirstSection" =>
array("O (ne)" => 'one',
"Comment_" => ';somecomment',
"Newline_" => '',
"Two" => 'two')
);
Спустя 6 минут, 42 секунды (10.04.2011 - 18:40) Let4ik_Russia написал(а):
Работает!)) но warning при чтении остается((
Спустя 3 минуты, 21 секунда (10.04.2011 - 18:44) Raito-kun написал(а):
в общем записывает функция верно. не считывает и ругается правильно, т.к. скобочек действительно не должно быть... надо думать.
варнинг убирается собачкой перед вызовом функции, другое дело что ты не сможешь считать информацию.
варнинг убирается собачкой перед вызовом функции, другое дело что ты не сможешь считать информацию.
Спустя 3 минуты, 10 секунд (10.04.2011 - 18:47) Let4ik_Russia написал(а):
Цитата (Raito-kun @ 10.04.2011 - 15:44) |
в общем записывает функция верно. не считывает и ругается правильно, т.к. скобочек действительно не должно быть... надо думать. |
это уже 4-й форум на который я пишу, на остальных говорят писать свои функции...
Спустя 9 минут, 24 секунды (10.04.2011 - 18:56) Raito-kun написал(а):
лови. работает для твоего случая.
function read_ini_file($f, &$r)
{
$null = "";
$r=$null;
$first_char = "";
$sec=$null;
$comment_chars=";#";
$num_comments = "0";
$num_newline = "0";
//Read to end of file with the newlines still attached into $f
$f = @file($f);
if ($f === false) {
return -2;
}
// Process all lines from 0 to count($f)
for ($i=0; $i<@count($f); $i++)
{
$w=@trim($f[$i]);
$first_char = @substr($w,0,1);
if ($w)
{
if ((@substr($w,0,1)=="[") and (@substr($w,-1,1))=="]") {
$sec=@substr($w,1,@strlen($w)-2);
$num_comments = 0;
$num_newline = 0;
}
else if ((stristr($comment_chars, $first_char) == true)) {
$r[$sec]["Comment_".$num_comments]=$w;
$num_comments = $num_comments +1;
}
else {
// Look for the = char to allow us to split the section into key and value
$w=@explode("=",$w);
$k=@trim($w[0]);
unset($w[0]);
$v=@trim(@implode("=",$w));
// look for the new lines
if ((@substr($v,0,1)=="\"") and (@substr($v,-1,1)=="\"")) {
$v=@substr($v,1,@strlen($v)-2);
}
$r[$sec][$k]=$v;
}
}
else {
$r[$sec]["Newline_".$num_newline]=$w;
$num_newline = $num_newline +1;
}
}
return 1;
}
Спустя 1 минута, 42 секунды (10.04.2011 - 18:58) Let4ik_Russia написал(а):
Цитата (Raito-kun @ 10.04.2011 - 15:44) |
варнинг убирается собачкой перед вызовом функции, другое дело что ты не сможешь считать информацию. |
Воспользовался функцией из 1-го топика для открытия, все прошло чисто без ошибок и чтение и запись и перезапись! вроде пока что полет нормальный!!!)))
Спустя 1 минута, 46 секунд (10.04.2011 - 19:00) Raito-kun написал(а):
вот тебе полный комплект функций. this уберешь, если не выкладываешь это в отдельный класс.
function read_ini_file($f, &$r)
{
$null = "";
$r=$null;
$first_char = "";
$sec=$null;
$comment_chars=";#";
$num_comments = "0";
$num_newline = "0";
//Read to end of file with the newlines still attached into $f
$f = @file($f);
if ($f === false) {
return -2;
}
// Process all lines from 0 to count($f)
for ($i=0; $i<@count($f); $i++)
{
$w=@trim($f[$i]);
$first_char = @substr($w,0,1);
if ($w)
{
if ((@substr($w,0,1)=="[") and (@substr($w,-1,1))=="]") {
$sec=@substr($w,1,@strlen($w)-2);
$num_comments = 0;
$num_newline = 0;
}
else if ((stristr($comment_chars, $first_char) == true)) {
$r[$sec]["Comment_".$num_comments]=$w;
$num_comments = $num_comments +1;
}
else {
// Look for the = char to allow us to split the section into key and value
$w=@explode("=",$w);
$k=@trim($w[0]);
unset($w[0]);
$v=@trim(@implode("=",$w));
// look for the new lines
if ((@substr($v,0,1)=="\"") and (@substr($v,-1,1)=="\"")) {
$v=@substr($v,1,@strlen($v)-2);
}
$r[$sec][$k]=$v;
}
}
else {
$r[$sec]["Newline_".$num_newline]=$w;
$num_newline = $num_newline +1;
}
}
return 1;
}
function write_ini_file($path, $assoc_arr) {
$content = "";
foreach ($assoc_arr as $key=>$elem) {
if (is_array($elem)) {
if ($key != '') {
$content .= "[".$key."]\r\n";
}
foreach ($elem as $key2=>$elem2) {
if ($this->beginsWith($key2,'Comment_') == 1 && $this->beginsWith($elem2,';')) {
$content .= $elem2."\r\n";
}
else if ($this->beginsWith($key2,'Newline_') == 1 && ($elem2 == '')) {
$content .= $elem2."\r\n";
}
else {
$content .= $key2." = ".$elem2."\r\n";
}
}
}
else {
$content .= $key." = ".$elem."\r\n";
}
}
if (!$handle = fopen($path, 'w')) {
return -2;
}
if (!fwrite($handle, $content)) {
return -2;
}
fclose($handle);
return 1;
}
function beginsWith( $str, $sub ) {
return ( substr( $str, 0, strlen( $sub ) ) === $sub );
}
Спустя 1 минута, 7 секунд (10.04.2011 - 19:01) Let4ik_Russia написал(а):
Спасибо тебе большое за помощь)) искренне благодарен...
теперь еще остается вопрос как считать конкретый ключ из нужной секции и поместить его значение в переменную)))
теперь еще остается вопрос как считать конкретый ключ из нужной секции и поместить его значение в переменную)))
Спустя 5 минут, 13 секунд (10.04.2011 - 19:06) Raito-kun написал(а):
read_ini_file("1.ini", $result);
$somevar = $result["FirstSection"]["O (ne)"];
echo $somevar;
Спустя 4 минуты, 20 секунд (10.04.2011 - 19:10) Let4ik_Russia написал(а):
Ваше спасибо тебе!!!!! Эт просто для меня неоценимо)))
а еще вопросик, при записи в файл он полность перезаписывается т.е. если нужно поправить один ключ то после записи только он один там и будет...эхх
а еще вопросик, при записи в файл он полность перезаписывается т.е. если нужно поправить один ключ то после записи только он один там и будет...эхх
Спустя 1 час, 15 минут, 43 секунды (10.04.2011 - 20:26) Raito-kun написал(а):
ну для этого нужно пройти по всем ключам и заменить на свой нужный:
$read_completed = read_ini_file("1.ini", $a);
$new_array = array();
if($read_completed) {
foreach($a as $section_key => $section_value) {
foreach($section_value as $param_key => $param_value) {
if($param_key == "o (ne)") {
$new_array[$section_key]["new key"] = $param_value;
continue;
}
$new_array[$section_key][$param_key] = $param_value;
}
}
}
write_ini_file('1.ini', $new_array);
Спустя 10 часов, 9 минут, 59 секунд (11.04.2011 - 06:36) Let4ik_Russia написал(а):
Цитата (Raito-kun @ 10.04.2011 - 17:26) |
ну для этого нужно пройти по всем ключам и заменить на свой нужный:$read_completed = read_ini_file("1.ini", $a); |
После этих действий получается что перезаписывается сам ключ а не его значение
Спустя 41 минута, 55 секунд (11.04.2011 - 07:18) Let4ik_Russia написал(а):
Вот файл который нужно редактировать, это файл программы TFTPD32:
Каждый ключ в нем обязателен, а его значения будут редактироваться с помощью полей для ввода, в которые я просто ввожу нужные значения нажимаю "ОК" и оно записывается в файл, но некоторые ключи нужно оставить без возможности редактирования, т.е. чтоб как они были так они и остались...Пользуюсь вот этой программой PHP Devel Studio это аля PHP for Delphi, вот как там реализована Работа с файлами INI в PHP, может легче этот скрипт поправить?
[DHCP]
Lease_NumLeases=0
IP_Pool=167815360
PoolSize=10
BootFile=pxelinux.0
DNS=-2103412524
Mask=16777215
Gateway=0
DomainName=
Lease (minutes)=2880
AddOptionNumber1=0
AddOptionValue1=
AddOptionNumber2=0
AddOptionValue2=
AddOptionNumber3=0
AddOptionValue3=
AddOptionNumber4=0
AddOptionValue4=
AddOptionNumber5=0
AddOptionValue5=
AddOptionNumber6=0
AddOptionValue6=
AddOptionNumber7=0
AddOptionValue7=
AddOptionNumber8=0
AddOptionValue8=
AddOptionNumber9=0
AddOptionValue9=
AddOptionNumber10=0
AddOptionValue10=
[TFTPD32]
BaseDirectory=D:\NETBoot
TftpPort=69
Hide=0
WinSize=1492
Negociate=1
PXECompatibility=0
DirText=0
ShowProgressBar=1
Timeout=3
MaxRetransmit=6
SecurityLevel=0
UnixStrings=1
Beep=0
VirtualRoot=1
MD5=0
LocalIP=
Services=5
TftpLogFile=
SaveSyslogFile=
PipeSyslogMsg=0
LowestUDPPort=0
HighestUDPPort=0
MulticastPort=0
MulticastAddress=
PersistantLeases=1
DHCP Ping=1
DHCP LocalIP=
Max Simultaneous Transfers=100
UseEventLog=0
Console Password=tftpd32
Support for port Option=0
Keep transfer Gui=5
Ignore ack for last TFTP packet=0
Каждый ключ в нем обязателен, а его значения будут редактироваться с помощью полей для ввода, в которые я просто ввожу нужные значения нажимаю "ОК" и оно записывается в файл, но некоторые ключи нужно оставить без возможности редактирования, т.е. чтоб как они были так они и остались...Пользуюсь вот этой программой PHP Devel Studio это аля PHP for Delphi, вот как там реализована Работа с файлами INI в PHP, может легче этот скрипт поправить?
Спустя 5 часов, 26 минут, 48 секунд (11.04.2011 - 12:45) Raito-kun написал(а):
так ты же и писал, что тебе нужно подправить один ключ. а подправить 1 значение еще намного легче.
собственно я написал тебе как править любой ключ и значение. можешь вынести это в функции и будет тебе полноценный инструмент для работы с ини файлами.
$read_completed = read_ini_file("1.ini", $result);
if($read_completed) {
$result['FirstSection']['key'] = 'new value';
}
write_ini_file('1.ini', $result);
собственно я написал тебе как править любой ключ и значение. можешь вынести это в функции и будет тебе полноценный инструмент для работы с ини файлами.