проблема с файлом parse_ini_file

#php

#php

Вопрос:

Я использую parse_ini_file() для чтения ini-файла, содержащего эту строку:

 [admin]
hide_fields[] = ctr_ad_headerImg
  

проблема в том, что он выводит его как,

 [admin]
hide_fields = Array
  

кто-нибудь может мне помочь? как мне прочитать «hide_fields[]» как строку?

С наилучшими пожеланиями Joricam

Мой код:

 $ini_array = parse_ini_file($config_path, true);
//print_r($ini_array);
//echo $ini_array["default_colors"]["sitebg"];
$ini_array["default_colors"]["sitebg"]="#000000";
write_php_ini($ini_array,$config_path);
  

Функции, которые я использую:

 function write_php_ini($array, $file)
{
    $res = array();
    foreach($array as $key => $val)
    {
        if(is_array($val))
        {
            $res[] = "[$key]";
            foreach($val as $skey => $sval) $res[] = "$skey = ".(is_numeric($sval) ? $sval : ''.$sval.'');
        }
        else $res[] = "$key = ".(is_numeric($val) ? $val : ''.$val.'');
    }
    safefilerewrite($file, implode("rn", $res));
}
//////
function safefilerewrite($fileName, $dataToSave)
{    if ($fp = fopen($fileName, 'w'))
    {
        $startTime = microtime();
        do
        {            $canWrite = flock($fp, LOCK_EX);
           // If lock not obtained sleep for 0 - 100 milliseconds, to avoid collision and CPU load
           if(!$canWrite) usleep(round(rand(0, 100)*1000));
        } while ((!$canWrite)and((microtime()-$startTime) < 1000));

        //file was locked so now we can store information
        if ($canWrite)
        {            fwrite($fp, $dataToSave);
            flock($fp, LOCK_UN);
        }
        fclose($fp);
    }

}
  

Ответ №1:

Parse_ini_file() обрабатывает такие идентификаторы. Он корректно преобразует их в массивы при чтении ini-файла:

  print_r(parse_ini_string("hide_fields[] = ctr_ad_headerImg"));
  

Сгенерирует:

 Array
(
    [hide_fields] => Array
        (
            [0] => ctr_ad_headerImg
        )
  

Запись может быть доступна как $cfg["hide_fields"][0] в PHP. Проблема в том, что функция вывода ini-файла, которую вы выбрали на этот раз, не понимает array атрибутов.

Поскольку вы, вероятно, заинтересованы в обходных путях вместо использования соответствующего инструмента, примените этот цикл преобразования к вашим ini-данным:

 // foreach ($sections ...) maybe

foreach ($cfg as $key=>$value) {
    if (is_array($value)) {
         foreach ($value as $i=>$v) {
             $cfg["$key"."[$i]"] = $v;
         }
         unset($cfg[$key]);
    }
}
  

И сохраните его впоследствии.


Отредактированный код

 function write_php_ini($array, $file)
{
    $res = array();
    foreach($array as $key => $val)
    {
        if(is_array($val))
        {
            $res[] = "[$key]";
            foreach($val as $skey => $sval) {
                if (is_array($sval)) {
                    foreach ($sval as $i=>$v) {
                        $res[] = "{$skey}[$i] = $v";
                    }
                }
                else {
                    $res[] = "$skey = $sval";
                }
            }
        }
        else $res[] = "$key = $val";
    }
    safefilerewrite($file, implode("rn", $res));
}

//////
function safefilerewrite($fileName, $dataToSave)
{    
    file_put_contents($fileName, $dataToSave, LOCK_EX);    
}
  

Комментарии:

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

2. Только если вы пообещаете, что это ваш самый последний вопрос .ini.

3. я обещаю, что после этого приложение, которое я создавал, будет завершено! Я также обещаю не прекращать изучение php здесь, я буду читать дальше, пока не стану экспертом и полностью не пойму все, что происходит с кодом. Даю вам слово!

4. Смотрите переписанный код. Это разбивает массивы на key[123]= записи. Если вам не нужен числовой индекс, то удалите $i там. Также взял на себя смелость отключить бессмысленную функцию сохранения файла.

5. ЭТО РАБОТАЕТ ПОТРЯСАЮЩЕ: D чувак, спасибо тебе ооочень большое! Можете ли вы предложить мне чтение / книгу, чтобы полностью понять, что происходит с вашим кодом?