создать ini-файл, записать значения в PHP
-
13-09-2019 - |
Вопрос
Я не могу найти способ легко создать новый файл, рассматривать его как INI-файл (а не php.ini или аналогичный...отдельный ini-файл для каждого пользователя) и создавать/удалять значения с помощью PHP.Кажется, PHP не предлагает простого способа создания ini-файла и чтения/записи/удаления значений.Пока что все это просто «читается» — ничего о создании записей или манипулировании ключами/значениями.
Решение
Нашел следующий фрагмент кода из комментариев документации PHP:
function write_ini_file($assoc_arr, $path, $has_sections=FALSE) {
$content = "";
if ($has_sections) {
foreach ($assoc_arr as $key=>$elem) {
$content .= "[".$key."]\n";
foreach ($elem as $key2=>$elem2) {
if(is_array($elem2))
{
for($i=0;$i<count($elem2);$i++)
{
$content .= $key2."[] = \"".$elem2[$i]."\"\n";
}
}
else if($elem2=="") $content .= $key2." = \n";
else $content .= $key2." = \"".$elem2."\"\n";
}
}
}
else {
foreach ($assoc_arr as $key=>$elem) {
if(is_array($elem))
{
for($i=0;$i<count($elem);$i++)
{
$content .= $key."[] = \"".$elem[$i]."\"\n";
}
}
else if($elem=="") $content .= $key." = \n";
else $content .= $key." = \"".$elem."\"\n";
}
}
if (!$handle = fopen($path, 'w')) {
return false;
}
$success = fwrite($handle, $content);
fclose($handle);
return $success;
}
Использование:
$sampleData = array(
'first' => array(
'first-1' => 1,
'first-2' => 2,
'first-3' => 3,
'first-4' => 4,
'first-5' => 5,
),
'second' => array(
'second-1' => 1,
'second-2' => 2,
'second-3' => 3,
'second-4' => 4,
'second-5' => 5,
));
write_ini_file($sampleData, './data.ini', true);
Удачи!
Другие советы
PEAR имеет два (модульно-проверенных) пакета, которые решают задачу, к которой вы стремитесь:
- Конфиг_Лайт - идеально, если вы только хотите
.ini
файлы - Конфигурация - тоже читает
.php
и.xml
файлы
Я предпочитаю использовать хорошо протестированный код, чем писать свой собственный.
Я не могу ручаться за то, насколько хорошо это работает, но есть несколько предложений по реализации противоположного parse_ini_file()
(т.е. write_ini_file
, что не является стандартной функцией PHP) на странице документации для parse_ini_file
.
Вы можете использовать write_ini_file
отправить значения в файл, parse_ini_file
чтобы прочитать их обратно - измените ассоциативный массив, который parse_ini_file
возвращается, а затем записывает измененный массив обратно в файл с помощью write_ini_file
.
Это работает для вас?
в этой части кода:
else {
foreach ($assoc_arr as $key=>$elem) {
if(is_array($elem))
{
for($i=0;$i<count($elem);$i++)
{
$content .= $key2."[] = \"".$elem[$i]."\"\n";
}
}
else if($elem=="") $content .= $key2." = \n";
else $content .= $key2." = \"".$elem."\"\n";
}
}
$key2 необходимо заменить на $key, иначе вы обнаружите пустые ключи в вашем .ini.
основываясь на приведенных выше ответах, я написал этот класс, который может быть полезен.Для PHP 5.3, но может быть легко адаптирован для предыдущих версий.
class Utils
{
public static function write_ini_file($assoc_arr, $path, $has_sections)
{
$content = '';
if (!$handle = fopen($path, 'w'))
return FALSE;
self::_write_ini_file_r($content, $assoc_arr, $has_sections);
if (!fwrite($handle, $content))
return FALSE;
fclose($handle);
return TRUE;
}
private static function _write_ini_file_r(&$content, $assoc_arr, $has_sections)
{
foreach ($assoc_arr as $key => $val) {
if (is_array($val)) {
if($has_sections) {
$content .= "[$key]\n";
self::_write_ini_file_r(&$content, $val, false);
} else {
foreach($val as $iKey => $iVal) {
if (is_int($iKey))
$content .= $key ."[] = $iVal\n";
else
$content .= $key ."[$iKey] = $iVal\n";
}
}
} else {
$content .= "$key = $val\n";
}
}
}
}
Я использую это, и это, кажется, работает
function listINIRecursive($array_name, $indent = 0)
{
global $str;
foreach ($array_name as $k => $v)
{
if (is_array($v))
{
for ($i=0; $i < $indent * 5; $i++){ $str.= " "; }
$str.= " [$k] \r\n";
listINIRecursive($v, $indent + 1);
}
else
{
for ($i=0; $i < $indent * 5; $i++){ $str.= " "; }
$str.= "$k = $v \r\n";
}
}
}
он возвращает текст для записи в файл .ini